Commit 3ee87d02 authored by Robert Griesemer's avatar Robert Griesemer

cmd/godoc: use go/build to determine package and example files

Also:
- faster code for example extraction
- simplify handling of command documentation:
  all "main" packages are treated as commands
- various minor cleanups along the way

For commands written in Go, any doc.go file containing
documentation must now be part of package main (rather
then package documentation), otherwise the documentation
won't show up in godoc (it will still build, though).

For commands written in C, documentation may still be
in doc.go files defining package documentation, but the
recommended way is to explicitly ignore those files with
a +build ignore constraint to define package main.

Fixes #4806.

R=adg, rsc, dave, bradfitz
CC=golang-dev
https://golang.org/cl/7333046
parent 04567299
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
correspond to Go identifiers). correspond to Go identifiers).
--> -->
{{with .PDoc}} {{with .PDoc}}
{{if $.IsPkg}} {{if not $.IsMain}}
<div id="short-nav"> <div id="short-nav">
<dl> <dl>
<dd><code>import "{{html .ImportPath}}"</code></dd> <dd><code>import "{{html .ImportPath}}"</code></dd>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
--------------------------------------- ---------------------------------------
*/}}{{with .PDoc}}{{if $.IsPkg}}PACKAGE */}}{{with .PDoc}}{{if not $.IsMain}}PACKAGE
package {{.Name}} package {{.Name}}
import "{{.ImportPath}}" import "{{.ImportPath}}"
......
...@@ -55,4 +55,4 @@ If the Google Code credentials are not provided the archival step ...@@ -55,4 +55,4 @@ If the Google Code credentials are not provided the archival step
will be skipped. will be skipped.
*/ */
package documentation package main
...@@ -20,4 +20,4 @@ ...@@ -20,4 +20,4 @@
// security mechanisms. Do not deploy it in untrusted environments. // security mechanisms. Do not deploy it in untrusted environments.
// By default, goplay listens only on localhost. This can be overridden with // By default, goplay listens only on localhost. This can be overridden with
// the -http parameter. Do so at your own risk. // the -http parameter. Do so at your own risk.
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
5a is a version of the Plan 9 assembler. The original is documented at 5a is a version of the Plan 9 assembler. The original is documented at
...@@ -11,4 +13,4 @@ ...@@ -11,4 +13,4 @@
Its target architecture is the ARM, referred to by these tools as arm. Its target architecture is the ARM, referred to by these tools as arm.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
5c is a version of the Plan 9 C compiler. The original is documented at 5c is a version of the Plan 9 C compiler. The original is documented at
...@@ -11,4 +13,4 @@ ...@@ -11,4 +13,4 @@
Its target architecture is the ARM, referred to by these tools as arm. Its target architecture is the ARM, referred to by these tools as arm.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
5g is the version of the gc compiler for the ARM. 5g is the version of the gc compiler for the ARM.
...@@ -10,4 +12,4 @@ The $GOARCH for these tools is arm. ...@@ -10,4 +12,4 @@ The $GOARCH for these tools is arm.
It reads .go files and outputs .5 files. The flags are documented in ../gc/doc.go. It reads .go files and outputs .5 files. The flags are documented in ../gc/doc.go.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
5l is the linker for the ARM. 5l is the linker for the ARM.
...@@ -10,4 +12,4 @@ The $GOARCH for these tools is arm. ...@@ -10,4 +12,4 @@ The $GOARCH for these tools is arm.
The flags are documented in ../ld/doc.go. The flags are documented in ../ld/doc.go.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
6a is a version of the Plan 9 assembler. The original is documented at 6a is a version of the Plan 9 assembler. The original is documented at
...@@ -11,4 +13,4 @@ ...@@ -11,4 +13,4 @@
Its target architecture is the x86-64, referred to by these tools as amd64. Its target architecture is the x86-64, referred to by these tools as amd64.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
6c is a version of the Plan 9 C compiler. The original is documented at 6c is a version of the Plan 9 C compiler. The original is documented at
...@@ -11,4 +13,4 @@ ...@@ -11,4 +13,4 @@
Its target architecture is the x86-64, referred to by these tools as amd64. Its target architecture is the x86-64, referred to by these tools as amd64.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
6g is the version of the gc compiler for the x86-64. 6g is the version of the gc compiler for the x86-64.
...@@ -10,4 +12,4 @@ The $GOARCH for these tools is amd64. ...@@ -10,4 +12,4 @@ The $GOARCH for these tools is amd64.
It reads .go files and outputs .6 files. The flags are documented in ../gc/doc.go. It reads .go files and outputs .6 files. The flags are documented in ../gc/doc.go.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
6l is the linker for the x86-64. 6l is the linker for the x86-64.
...@@ -10,4 +12,4 @@ The $GOARCH for these tools is amd64. ...@@ -10,4 +12,4 @@ The $GOARCH for these tools is amd64.
The flags are documented in ../ld/doc.go. The flags are documented in ../ld/doc.go.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
8a is a version of the Plan 9 assembler. The original is documented at 8a is a version of the Plan 9 assembler. The original is documented at
...@@ -11,4 +13,4 @@ ...@@ -11,4 +13,4 @@
Its target architecture is the x86, referred to by these tools for historical reasons as 386. Its target architecture is the x86, referred to by these tools for historical reasons as 386.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
8c is a version of the Plan 9 C compiler. The original is documented at 8c is a version of the Plan 9 C compiler. The original is documented at
...@@ -11,4 +13,4 @@ ...@@ -11,4 +13,4 @@
Its target architecture is the x86, referred to by these tools for historical reasons as 386. Its target architecture is the x86, referred to by these tools for historical reasons as 386.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
8g is the version of the gc compiler for the x86. 8g is the version of the gc compiler for the x86.
...@@ -10,4 +12,4 @@ The $GOARCH for these tools is 386. ...@@ -10,4 +12,4 @@ The $GOARCH for these tools is 386.
It reads .go files and outputs .8 files. The flags are documented in ../gc/doc.go. It reads .go files and outputs .8 files. The flags are documented in ../gc/doc.go.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
8l is the linker for the 32-bit x86. 8l is the linker for the 32-bit x86.
...@@ -10,4 +12,4 @@ The $GOARCH for these tools is 386. ...@@ -10,4 +12,4 @@ The $GOARCH for these tools is 386.
The flags are documented in ../ld/doc.go. The flags are documented in ../ld/doc.go.
*/ */
package documentation package main
...@@ -2,10 +2,12 @@ ...@@ -2,10 +2,12 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
This directory contains the portable section of the Plan 9 C compilers. This directory contains the portable section of the Plan 9 C compilers.
See ../6c, ../8c, and ../5c for more information. See ../6c, ../8c, and ../5c for more information.
*/ */
package documentation package main
...@@ -133,4 +133,4 @@ Cgo does not yet work with gccgo. ...@@ -133,4 +133,4 @@ Cgo does not yet work with gccgo.
See "C? Go? Cgo!" for an introduction to using cgo: See "C? Go? Cgo!" for an introduction to using cgo:
http://golang.org/doc/articles/c_go_cgo.html http://golang.org/doc/articles/c_go_cgo.html
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
Cov is a rudimentary code coverage tool. Cov is a rudimentary code coverage tool.
...@@ -31,4 +33,4 @@ The options are: ...@@ -31,4 +33,4 @@ The options are:
The program is the same for all architectures: 386, amd64, and arm. The program is the same for all architectures: 386, amd64, and arm.
*/ */
package documentation package main
...@@ -33,4 +33,4 @@ Fix does not make backup copies of the files that it edits. ...@@ -33,4 +33,4 @@ Fix does not make backup copies of the files that it edits.
Instead, use a version control system's ``diff'' functionality to inspect Instead, use a version control system's ``diff'' functionality to inspect
the changes that fix makes before committing them. the changes that fix makes before committing them.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
Gc is the generic label for the family of Go compilers Gc is the generic label for the family of Go compilers
...@@ -86,4 +88,4 @@ in Go) does not allow any of the pointers passed as arguments to escape into the ...@@ -86,4 +88,4 @@ in Go) does not allow any of the pointers passed as arguments to escape into the
heap or into the values returned from the function. This information can be used as heap or into the values returned from the function. This information can be used as
during the compiler's escape analysis of Go code calling the function. during the compiler's escape analysis of Go code calling the function.
*/ */
package documentation package main
...@@ -812,6 +812,6 @@ See the documentation of the testing package for more information. ...@@ -812,6 +812,6 @@ See the documentation of the testing package for more information.
*/ */
package documentation package main
// NOTE: cmdDoc is in fmt.go. // NOTE: cmdDoc is in fmt.go.
...@@ -200,7 +200,7 @@ var documentationTemplate = `// Copyright 2011 The Go Authors. All rights reser ...@@ -200,7 +200,7 @@ var documentationTemplate = `// Copyright 2011 The Go Authors. All rights reser
{{end}}*/ {{end}}*/
package documentation package main
// NOTE: cmdDoc is in fmt.go. // NOTE: cmdDoc is in fmt.go.
` `
......
...@@ -74,7 +74,7 @@ func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth i ...@@ -74,7 +74,7 @@ func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth i
// determine number of subdirectories and if there are package files // determine number of subdirectories and if there are package files
ndirs := 0 ndirs := 0
hasPkgFiles := false hasPkgFiles := false
var synopses [4]string // prioritized package documentation (0 == highest priority) var synopses [3]string // prioritized package documentation (0 == highest priority)
for _, d := range list { for _, d := range list {
switch { switch {
case isPkgDir(d): case isPkgDir(d):
...@@ -95,12 +95,10 @@ func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth i ...@@ -95,12 +95,10 @@ func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth i
switch file.Name.Name { switch file.Name.Name {
case name: case name:
i = 0 // normal case: directory name matches package name i = 0 // normal case: directory name matches package name
case fakePkgName:
i = 1 // synopses for commands
case "main": case "main":
i = 2 // directory contains a main package i = 1 // directory contains a main package
default: default:
i = 3 // none of the above i = 2 // none of the above
} }
if 0 <= i && i < len(synopses) && synopses[i] == "" { if 0 <= i && i < len(synopses) && synopses[i] == "" {
synopses[i] = doc.Synopsis(file.Doc.Text()) synopses[i] = doc.Synopsis(file.Doc.Text())
......
...@@ -127,4 +127,4 @@ See "Godoc: documenting Go code" for how to write good comments for godoc: ...@@ -127,4 +127,4 @@ See "Godoc: documenting Go code" for how to write good comments for godoc:
http://golang.org/doc/articles/godoc_documenting_go_code.html http://golang.org/doc/articles/godoc_documenting_go_code.html
*/ */
package documentation package main
This diff is collapsed.
...@@ -2,10 +2,8 @@ ...@@ -2,10 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// This file contains support functions for parsing .go files. // This file contains support functions for parsing .go files
// Similar functionality is found in package go/parser but the // accessed via godoc's file system fs.
// functions here operate using godoc's file system fs instead
// of calling the OS's file operations directly.
package main package main
...@@ -13,7 +11,6 @@ import ( ...@@ -13,7 +11,6 @@ import (
"go/ast" "go/ast"
"go/parser" "go/parser"
"go/token" "go/token"
"os"
pathpkg "path" pathpkg "path"
) )
...@@ -25,44 +22,16 @@ func parseFile(fset *token.FileSet, filename string, mode parser.Mode) (*ast.Fil ...@@ -25,44 +22,16 @@ func parseFile(fset *token.FileSet, filename string, mode parser.Mode) (*ast.Fil
return parser.ParseFile(fset, filename, src, mode) return parser.ParseFile(fset, filename, src, mode)
} }
func parseFiles(fset *token.FileSet, filenames []string) (pkgs map[string]*ast.Package, first error) { func parseFiles(fset *token.FileSet, abspath string, localnames []string) (map[string]*ast.File, error) {
pkgs = make(map[string]*ast.Package) files := make(map[string]*ast.File)
for _, filename := range filenames { for _, f := range localnames {
file, err := parseFile(fset, filename, parser.ParseComments) absname := pathpkg.Join(abspath, f)
if err != nil { file, err := parseFile(fset, absname, parser.ParseComments)
if first == nil {
first = err
}
continue
}
name := file.Name.Name
pkg, found := pkgs[name]
if !found {
// TODO(gri) Use NewPackage here; reconsider ParseFiles API.
pkg = &ast.Package{Name: name, Files: make(map[string]*ast.File)}
pkgs[name] = pkg
}
pkg.Files[filename] = file
}
return
}
func parseDir(fset *token.FileSet, path string, filter func(os.FileInfo) bool) (map[string]*ast.Package, error) {
list, err := fs.ReadDir(path)
if err != nil { if err != nil {
return nil, err return nil, err
} }
files[absname] = file
filenames := make([]string, len(list))
i := 0
for _, d := range list {
if filter == nil || filter(d) {
filenames[i] = pathpkg.Join(path, d.Name())
i++
}
} }
filenames = filenames[0:i]
return parseFiles(fset, filenames) return files, nil
} }
...@@ -72,6 +72,6 @@ To convert the package tree from explicit slice upper bounds to implicit ones: ...@@ -72,6 +72,6 @@ To convert the package tree from explicit slice upper bounds to implicit ones:
gofmt -r 'α[β:len(α)] -> α[β:]' -w $GOROOT/src/pkg gofmt -r 'α[β:len(α)] -> α[β:]' -w $GOROOT/src/pkg
*/ */
package documentation package main
// BUG(rsc): The implementation of -r is a bit slow. // BUG(rsc): The implementation of -r is a bit slow.
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
Ld is the portable code for a modified version of the Plan 9 linker. The original is documented at Ld is the portable code for a modified version of the Plan 9 linker. The original is documented at
...@@ -70,4 +72,4 @@ Options new in this version: ...@@ -70,4 +72,4 @@ Options new in this version:
calls, not false positives caused by dead temporaries stored in calls, not false positives caused by dead temporaries stored in
the current function call. the current function call.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
Nm is a version of the Plan 9 nm command. The original is documented at Nm is a version of the Plan 9 nm command. The original is documented at
...@@ -18,4 +20,4 @@ Usage: ...@@ -18,4 +20,4 @@ Usage:
go tool nm [-aghnsTu] file go tool nm [-aghnsTu] file
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
Pack is a variant of the Plan 9 ar tool. The original is documented at Pack is a variant of the Plan 9 ar tool. The original is documented at
...@@ -24,4 +26,4 @@ The new option 'P' causes pack to remove the given prefix ...@@ -24,4 +26,4 @@ The new option 'P' causes pack to remove the given prefix
from file names in the line number information in object files from file names in the line number information in object files
that are already stored in or added to the archive. that are already stored in or added to the archive.
*/ */
package documentation package main
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build ignore
/* /*
Prof is a rudimentary real-time profiler. Prof is a rudimentary real-time profiler.
...@@ -44,4 +46,4 @@ every 100ms until the program completes. ...@@ -44,4 +46,4 @@ every 100ms until the program completes.
It is installed as go tool prof and is architecture-independent. It is installed as go tool prof and is architecture-independent.
*/ */
package documentation package main
...@@ -67,4 +67,4 @@ The other flags are: ...@@ -67,4 +67,4 @@ The other flags are:
-printfuncs=Warn:1,Warnf:1 -printfuncs=Warn:1,Warnf:1
*/ */
package documentation package main
...@@ -48,4 +48,4 @@ referenced by yacc's generated code. Setting it to distinct values ...@@ -48,4 +48,4 @@ referenced by yacc's generated code. Setting it to distinct values
allows multiple grammars to be placed in a single package. allows multiple grammars to be placed in a single package.
*/ */
package documentation package main
...@@ -19,4 +19,4 @@ The --start flag specifies the name of the start production for ...@@ -19,4 +19,4 @@ The --start flag specifies the name of the start production for
the grammar; it defaults to "Start". the grammar; it defaults to "Start".
*/ */
package documentation package main
...@@ -58,6 +58,6 @@ To verify the output of a pipe: ...@@ -58,6 +58,6 @@ To verify the output of a pipe:
echo "package foo" | gotype echo "package foo" | gotype
*/ */
package documentation package main
// BUG(gri): At the moment, only single-file scope analysis is performed. // BUG(gri): At the moment, only single-file scope analysis is performed.
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