1
0
mirror of https://github.com/golang/go synced 2024-11-20 07:54:39 -07:00

godoc: show comments in various filtered views

Fixes #3454.

R=rsc
CC=golang-dev
https://golang.org/cl/6305069
This commit is contained in:
Robert Griesemer 2012-06-13 13:32:59 -07:00
parent f5f23e075e
commit 8140cd9149
2 changed files with 22 additions and 4 deletions

View File

@ -866,6 +866,19 @@ func inList(name string, list []string) bool {
return false
}
// packageExports is a local implementation of ast.PackageExports
// which correctly updates each package file's comment list.
// (The ast.PackageExports signature is frozen, hence the local
// implementation).
//
func packageExports(fset *token.FileSet, pkg *ast.Package) {
for _, src := range pkg.Files {
cmap := ast.NewCommentMap(fset, src)
ast.FileExports(src)
src.Comments = cmap.Filter(src).Comments()
}
}
// getPageInfo returns the PageInfo for a package directory abspath. If the
// parameter genAST is set, an AST containing only the package exports is
// computed (PageInfo.PAst), otherwise package documentation (PageInfo.Doc)
@ -1012,9 +1025,9 @@ func (h *docServer) getPageInfo(abspath, relpath, pkgname string, mode PageInfoM
// TODO(gri) Consider eliminating export filtering in this mode,
// or perhaps eliminating the mode altogether.
if mode&noFiltering == 0 {
ast.PackageExports(pkg)
packageExports(fset, pkg)
}
past = ast.MergePackageFiles(pkg, ast.FilterUnassociatedComments)
past = ast.MergePackageFiles(pkg, 0)
}
}

View File

@ -36,6 +36,7 @@ import (
"fmt"
"go/ast"
"go/build"
"go/printer"
"io"
"log"
"net/http"
@ -424,20 +425,24 @@ func main() {
filter := func(s string) bool { return rx.MatchString(s) }
switch {
case info.PAst != nil:
cmap := ast.NewCommentMap(info.FSet, info.PAst)
ast.FilterFile(info.PAst, filter)
// Special case: Don't use templates for printing
// so we only get the filtered declarations without
// package clause or extra whitespace.
for i, d := range info.PAst.Decls {
// determine the comments associated with d only
comments := cmap.Filter(d).Comments()
cn := &printer.CommentedNode{Node: d, Comments: comments}
if i > 0 {
fmt.Println()
}
if *html {
var buf bytes.Buffer
writeNode(&buf, info.FSet, d)
writeNode(&buf, info.FSet, cn)
FormatText(os.Stdout, buf.Bytes(), -1, true, "", nil)
} else {
writeNode(os.Stdout, info.FSet, d)
writeNode(os.Stdout, info.FSet, cn)
}
fmt.Println()
}