mirror of
https://github.com/golang/go
synced 2024-11-23 17:40:03 -07:00
go/doc: fix detection of whole file examples
After CL 211357 (commit 499dc1c
),
hasTests and numDecl were not updated properly for function
declarations with parameters, which affected the whole file
example detection logic. This caused examples like
package foo_test
func Foo(x int) {
}
func Example() {
fmt.Println("Hello, world!")
// Output: Hello, world!
}
to not be detected as whole file ones.
This commit is contained in:
parent
ae3f98c51b
commit
cc71c31124
@ -62,9 +62,6 @@ func Examples(testFiles ...*ast.File) []*Example {
|
||||
if !ok || f.Recv != nil {
|
||||
continue
|
||||
}
|
||||
if params := f.Type.Params; len(params.List) != 0 {
|
||||
continue // function has params; not a valid example
|
||||
}
|
||||
numDecl++
|
||||
name := f.Name.Name
|
||||
if isTest(name, "Test") || isTest(name, "Benchmark") {
|
||||
@ -74,6 +71,9 @@ func Examples(testFiles ...*ast.File) []*Example {
|
||||
if !isTest(name, "Example") {
|
||||
continue
|
||||
}
|
||||
if params := f.Type.Params; len(params.List) != 0 {
|
||||
continue // function has params; not a valid example
|
||||
}
|
||||
if f.Body == nil { // ast.File.Body nil dereference (see issue 28044)
|
||||
continue
|
||||
}
|
||||
|
@ -331,25 +331,65 @@ func main() {
|
||||
}
|
||||
`
|
||||
|
||||
const exampleWholeFileFunction = `package foo_test
|
||||
|
||||
func Foo(x int) {
|
||||
}
|
||||
|
||||
func Example() {
|
||||
fmt.Println("Hello, world!")
|
||||
// Output: Hello, world!
|
||||
}
|
||||
`
|
||||
|
||||
const exampleWholeFileFunctionOutput = `package main
|
||||
|
||||
func Foo(x int) {
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Println("Hello, world!")
|
||||
}
|
||||
`
|
||||
|
||||
var exampleWholeFileTestCases = []struct {
|
||||
Title, Source, Play, Output string
|
||||
}{
|
||||
{
|
||||
"Methods",
|
||||
exampleWholeFile,
|
||||
exampleWholeFileOutput,
|
||||
"Hello, world!\n",
|
||||
},
|
||||
{
|
||||
"Function",
|
||||
exampleWholeFileFunction,
|
||||
exampleWholeFileFunctionOutput,
|
||||
"Hello, world!\n",
|
||||
},
|
||||
}
|
||||
|
||||
func TestExamplesWholeFile(t *testing.T) {
|
||||
fset := token.NewFileSet()
|
||||
file, err := parser.ParseFile(fset, "test.go", strings.NewReader(exampleWholeFile), parser.ParseComments)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
es := doc.Examples(file)
|
||||
if len(es) != 1 {
|
||||
t.Fatalf("wrong number of examples; got %d want 1", len(es))
|
||||
}
|
||||
e := es[0]
|
||||
if e.Name != "" {
|
||||
t.Errorf("got Name == %q, want %q", e.Name, "")
|
||||
}
|
||||
if g, w := formatFile(t, fset, e.Play), exampleWholeFileOutput; g != w {
|
||||
t.Errorf("got Play == %q, want %q", g, w)
|
||||
}
|
||||
if g, w := e.Output, "Hello, world!\n"; g != w {
|
||||
t.Errorf("got Output == %q, want %q", g, w)
|
||||
for _, c := range exampleWholeFileTestCases {
|
||||
fset := token.NewFileSet()
|
||||
file, err := parser.ParseFile(fset, "test.go", strings.NewReader(c.Source), parser.ParseComments)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
es := doc.Examples(file)
|
||||
if len(es) != 1 {
|
||||
t.Fatalf("%s: wrong number of examples; got %d want 1", c.Title, len(es))
|
||||
}
|
||||
e := es[0]
|
||||
if e.Name != "" {
|
||||
t.Errorf("%s: got Name == %q, want %q", c.Title, e.Name, "")
|
||||
}
|
||||
if g, w := formatFile(t, fset, e.Play), c.Play; g != w {
|
||||
t.Errorf("%s: got Play == %q, want %q", c.Title, g, w)
|
||||
}
|
||||
if g, w := e.Output, c.Output; g != w {
|
||||
t.Errorf("%s: got Output == %q, want %q", c.Title, g, w)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user