1
0
mirror of https://github.com/golang/go synced 2024-11-21 23:24:41 -07:00

go/doc, godoc: regard lone examples as "whole file" examples

Fixes #2930.

R=r, gri, rsc
CC=golang-dev
https://golang.org/cl/5657048
This commit is contained in:
Andrew Gerrand 2012-02-14 17:19:59 +11:00
parent 1c987a321f
commit e11632ee00
4 changed files with 39 additions and 9 deletions

View File

@ -187,6 +187,10 @@ Here is an example of an example:
Println("The output of this example function.") Println("The output of this example function.")
} }
The entire test file is presented as the example when it contains a single
example function, at least one other function, type, variable, or constant
declaration, and no test or benchmark functions.
See the documentation of the testing package for more information. See the documentation of the testing package for more information.
`, `,
} }

View File

@ -516,10 +516,13 @@ func example_htmlFunc(funcName string, examples []*doc.Example, fset *token.File
continue continue
} }
// print code, unindent and remove surrounding braces // print code
code := node_htmlFunc(eg.Body, fset) code := node_htmlFunc(eg.Body, fset)
code = strings.Replace(code, "\n ", "\n", -1) if len(code) > 0 && code[0] == '{' {
code = code[2 : len(code)-2] // unindent and remove surrounding braces
code = strings.Replace(code, "\n ", "\n", -1)
code = code[2 : len(code)-2]
}
err := exampleHTML.Execute(&buf, struct { err := exampleHTML.Execute(&buf, struct {
Name, Code, Output string Name, Code, Output string

View File

@ -9,6 +9,7 @@ package doc
import ( import (
"go/ast" "go/ast"
"go/printer" "go/printer"
"go/token"
"strings" "strings"
"unicode" "unicode"
"unicode/utf8" "unicode/utf8"
@ -21,28 +22,47 @@ type Example struct {
} }
func Examples(pkg *ast.Package) []*Example { func Examples(pkg *ast.Package) []*Example {
var examples []*Example var list []*Example
for _, src := range pkg.Files { for _, file := range pkg.Files {
for _, decl := range src.Decls { hasTests := false // file contains tests or benchmarks
numDecl := 0 // number of non-import declarations in the file
var flist []*Example
for _, decl := range file.Decls {
if g, ok := decl.(*ast.GenDecl); ok && g.Tok != token.IMPORT {
numDecl++
continue
}
f, ok := decl.(*ast.FuncDecl) f, ok := decl.(*ast.FuncDecl)
if !ok { if !ok {
continue continue
} }
numDecl++
name := f.Name.Name name := f.Name.Name
if isTest(name, "Test") || isTest(name, "Benchmark") {
hasTests = true
continue
}
if !isTest(name, "Example") { if !isTest(name, "Example") {
continue continue
} }
examples = append(examples, &Example{ flist = append(flist, &Example{
Name: name[len("Example"):], Name: name[len("Example"):],
Body: &printer.CommentedNode{ Body: &printer.CommentedNode{
Node: f.Body, Node: f.Body,
Comments: src.Comments, Comments: file.Comments,
}, },
Output: f.Doc.Text(), Output: f.Doc.Text(),
}) })
} }
if !hasTests && numDecl > 1 && len(flist) == 1 {
// If this file only has one example function, some
// other top-level declarations, and no tests or
// benchmarks, use the whole file as the example.
flist[0].Body.Node = file
}
list = append(list, flist...)
} }
return examples return list
} }
// isTest tells whether name looks like a test, example, or benchmark. // isTest tells whether name looks like a test, example, or benchmark.

View File

@ -64,6 +64,9 @@
// func ExampleT_suffix() { ... } // func ExampleT_suffix() { ... }
// func ExampleT_M_suffix() { ... } // func ExampleT_M_suffix() { ... }
// //
// The entire test file is presented as the example when it contains a single
// example function, at least one other function, type, variable, or constant
// declaration, and no test or benchmark functions.
package testing package testing
import ( import (