Commit b6e2d6b7 authored by Robert Griesemer's avatar Robert Griesemer

go/doc: move Example code from go/ast to go/doc.

Fixes #3048.

R=rsc
CC=golang-dev
https://golang.org/cl/5672081
parent c4c92ebe
...@@ -1126,6 +1126,7 @@ static char *buildorder[] = { ...@@ -1126,6 +1126,7 @@ static char *buildorder[] = {
"pkg/net/url", "pkg/net/url",
"pkg/text/template/parse", "pkg/text/template/parse",
"pkg/text/template", "pkg/text/template",
"pkg/go/doc",
"cmd/go", "cmd/go",
}; };
...@@ -1165,6 +1166,7 @@ static char *cleantab[] = { ...@@ -1165,6 +1166,7 @@ static char *cleantab[] = {
"pkg/fmt", "pkg/fmt",
"pkg/go/ast", "pkg/go/ast",
"pkg/go/build", "pkg/go/build",
"pkg/go/doc",
"pkg/go/parser", "pkg/go/parser",
"pkg/go/scanner", "pkg/go/scanner",
"pkg/go/token", "pkg/go/token",
......
...@@ -9,6 +9,7 @@ import ( ...@@ -9,6 +9,7 @@ import (
"fmt" "fmt"
"go/ast" "go/ast"
"go/build" "go/build"
"go/doc"
"go/parser" "go/parser"
"go/token" "go/token"
"os" "os"
...@@ -719,7 +720,7 @@ func (t *testFuncs) load(filename, pkg string, seen *bool) error { ...@@ -719,7 +720,7 @@ func (t *testFuncs) load(filename, pkg string, seen *bool) error {
*seen = true *seen = true
} }
} }
for _, e := range ast.Examples(f) { for _, e := range doc.Examples(f) {
if e.Output == "" { if e.Output == "" {
// Don't run examples with no output. // Don't run examples with no output.
continue continue
......
...@@ -501,7 +501,7 @@ func startsWithUppercase(s string) bool { ...@@ -501,7 +501,7 @@ func startsWithUppercase(s string) bool {
var exampleOutputRx = regexp.MustCompile(`(?i)//[[:space:]]*output:`) var exampleOutputRx = regexp.MustCompile(`(?i)//[[:space:]]*output:`)
func example_htmlFunc(funcName string, examples []*ast.Example, fset *token.FileSet) string { func example_htmlFunc(funcName string, examples []*doc.Example, fset *token.FileSet) string {
var buf bytes.Buffer var buf bytes.Buffer
for _, eg := range examples { for _, eg := range examples {
name := eg.Name name := eg.Name
...@@ -979,7 +979,7 @@ type PageInfo struct { ...@@ -979,7 +979,7 @@ type PageInfo struct {
FSet *token.FileSet // corresponding file set FSet *token.FileSet // corresponding file set
PAst *ast.File // nil if no single AST with package exports PAst *ast.File // nil if no single AST with package exports
PDoc *doc.Package // nil if no single package documentation PDoc *doc.Package // nil if no single package documentation
Examples []*ast.Example // nil if no example code Examples []*doc.Example // nil if no example code
Dirs *DirList // nil if no directory information Dirs *DirList // nil if no directory information
DirTime time.Time // directory time stamp DirTime time.Time // directory time stamp
DirFlat bool // if set, show directory in a flat (non-indented) manner DirFlat bool // if set, show directory in a flat (non-indented) manner
...@@ -1128,7 +1128,7 @@ func (h *httpHandler) getPageInfo(abspath, relpath, pkgname string, mode PageInf ...@@ -1128,7 +1128,7 @@ func (h *httpHandler) getPageInfo(abspath, relpath, pkgname string, mode PageInf
} }
// get examples from *_test.go files // get examples from *_test.go files
var examples []*ast.Example var examples []*doc.Example
filter = func(d os.FileInfo) bool { filter = func(d os.FileInfo) bool {
return isGoFile(d) && strings.HasSuffix(d.Name(), "_test.go") return isGoFile(d) && strings.HasSuffix(d.Name(), "_test.go")
} }
...@@ -1140,7 +1140,7 @@ func (h *httpHandler) getPageInfo(abspath, relpath, pkgname string, mode PageInf ...@@ -1140,7 +1140,7 @@ func (h *httpHandler) getPageInfo(abspath, relpath, pkgname string, mode PageInf
for _, f := range testpkg.Files { for _, f := range testpkg.Files {
files = append(files, f) files = append(files, f)
} }
examples = append(examples, ast.Examples(files...)...) examples = append(examples, doc.Examples(files...)...)
} }
} }
......
...@@ -4,9 +4,10 @@ ...@@ -4,9 +4,10 @@
// Extract example functions from file ASTs. // Extract example functions from file ASTs.
package ast package doc
import ( import (
"go/ast"
"go/token" "go/token"
"regexp" "regexp"
"sort" "sort"
...@@ -18,23 +19,23 @@ import ( ...@@ -18,23 +19,23 @@ import (
type Example struct { type Example struct {
Name string // name of the item being exemplified Name string // name of the item being exemplified
Doc string // example function doc string Doc string // example function doc string
Code Node Code ast.Node
Comments []*CommentGroup Comments []*ast.CommentGroup
Output string // expected output Output string // expected output
} }
func Examples(files ...*File) []*Example { func Examples(files ...*ast.File) []*Example {
var list []*Example var list []*Example
for _, file := range files { for _, file := range files {
hasTests := false // file contains tests or benchmarks hasTests := false // file contains tests or benchmarks
numDecl := 0 // number of non-import declarations in the file numDecl := 0 // number of non-import declarations in the file
var flist []*Example var flist []*Example
for _, decl := range file.Decls { for _, decl := range file.Decls {
if g, ok := decl.(*GenDecl); ok && g.Tok != token.IMPORT { if g, ok := decl.(*ast.GenDecl); ok && g.Tok != token.IMPORT {
numDecl++ numDecl++
continue continue
} }
f, ok := decl.(*FuncDecl) f, ok := decl.(*ast.FuncDecl)
if !ok { if !ok {
continue continue
} }
...@@ -73,9 +74,9 @@ func Examples(files ...*File) []*Example { ...@@ -73,9 +74,9 @@ func Examples(files ...*File) []*Example {
var outputPrefix = regexp.MustCompile(`(?i)^[[:space:]]*output:`) var outputPrefix = regexp.MustCompile(`(?i)^[[:space:]]*output:`)
func exampleOutput(fun *FuncDecl, comments []*CommentGroup) string { func exampleOutput(fun *ast.FuncDecl, comments []*ast.CommentGroup) string {
// find the last comment in the function // find the last comment in the function
var last *CommentGroup var last *ast.CommentGroup
for _, cg := range comments { for _, cg := range comments {
if cg.Pos() < fun.Pos() { if cg.Pos() < fun.Pos() {
continue continue
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment