]> Cypherpunks repositories - gostls13.git/commitdiff
godoc: show comments in various filtered views
authorRobert Griesemer <gri@golang.org>
Wed, 13 Jun 2012 20:32:59 +0000 (13:32 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 13 Jun 2012 20:32:59 +0000 (13:32 -0700)
Fixes #3454.

R=rsc
CC=golang-dev
https://golang.org/cl/6305069

src/cmd/godoc/godoc.go
src/cmd/godoc/main.go

index c3a6c0f16af7e10680a2788ca6d694dcb245d0a0..b7e7c39952cd9c4d35964b294edd4829229be6bb 100644 (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)
                }
        }
 
index 3efa349b5178b08f29b59e9f393638d3abfe7533..da20731961de5a4ec16f5cf3f354ea52ce2bccfd 100644 (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()
                        }