mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/doc: add a -src flag to show original source
It's long-desired but was blocked by #26835. That is now fixed, so it's easy. When -src is off, we behave as before. But with -src set, initialize the go/doc package to preserve the original AST and things flow very easily. With -src, since you're seeing inside the package source anyway it shows unexported fields and constants: you see the original source. But you still need -u to ask about them. Fixes #18807 Change-Id: I473e90323b4eff0735360274dc0d2d9dba16ff8b Reviewed-on: https://go-review.googlesource.com/c/140959 Reviewed-by: Andrew Gerrand <adg@golang.org> Run-TryBot: Andrew Gerrand <adg@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
d5e722034a
commit
294d16c9c5
6 changed files with 141 additions and 56 deletions
|
|
@ -137,7 +137,11 @@ func parsePackage(writer io.Writer, pkg *build.Package, userPath string) *Packag
|
|||
// from finding the symbol. Work around this for now, but we
|
||||
// should fix it in go/doc.
|
||||
// A similar story applies to factory functions.
|
||||
docPkg := doc.New(astPkg, pkg.ImportPath, doc.AllDecls)
|
||||
mode := doc.AllDecls
|
||||
if showSrc {
|
||||
mode |= doc.PreserveAST // See comment for Package.emit.
|
||||
}
|
||||
docPkg := doc.New(astPkg, pkg.ImportPath, mode)
|
||||
for _, typ := range docPkg.Types {
|
||||
docPkg.Consts = append(docPkg.Consts, typ.Consts...)
|
||||
docPkg.Vars = append(docPkg.Vars, typ.Vars...)
|
||||
|
|
@ -177,14 +181,16 @@ func (pkg *Package) newlines(n int) {
|
|||
}
|
||||
}
|
||||
|
||||
// emit prints the node.
|
||||
// emit prints the node. If showSrc is true, it ignores the provided comment,
|
||||
// assuming the comment is in the node itself. Otherwise, the go/doc package
|
||||
// clears the stuff we don't want to print anyway. It's a bit of a magic trick.
|
||||
func (pkg *Package) emit(comment string, node ast.Node) {
|
||||
if node != nil {
|
||||
err := format.Node(&pkg.buf, pkg.fs, node)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if comment != "" {
|
||||
if comment != "" && !showSrc {
|
||||
pkg.newlines(1)
|
||||
doc.ToText(&pkg.buf, comment, " ", indent, indentedWidth)
|
||||
pkg.newlines(2) // Blank line after comment to separate from next item.
|
||||
|
|
@ -611,7 +617,6 @@ func (pkg *Package) symbolDoc(symbol string) bool {
|
|||
}
|
||||
// Symbol is a function.
|
||||
decl := fun.Decl
|
||||
decl.Body = nil
|
||||
pkg.emit(fun.Doc, decl)
|
||||
found = true
|
||||
}
|
||||
|
|
@ -641,7 +646,7 @@ func (pkg *Package) symbolDoc(symbol string) bool {
|
|||
}
|
||||
|
||||
for _, ident := range vspec.Names {
|
||||
if isExported(ident.Name) {
|
||||
if showSrc || isExported(ident.Name) {
|
||||
if vspec.Type == nil && vspec.Values == nil && typ != nil {
|
||||
// This a standalone identifier, as in the case of iota usage.
|
||||
// Thus, assume the type comes from the previous type.
|
||||
|
|
@ -701,9 +706,10 @@ func (pkg *Package) symbolDoc(symbol string) bool {
|
|||
}
|
||||
|
||||
// trimUnexportedElems modifies spec in place to elide unexported fields from
|
||||
// structs and methods from interfaces (unless the unexported flag is set).
|
||||
// structs and methods from interfaces (unless the unexported flag is set or we
|
||||
// are asked to show the original source).
|
||||
func trimUnexportedElems(spec *ast.TypeSpec) {
|
||||
if unexported {
|
||||
if unexported || showSrc {
|
||||
return
|
||||
}
|
||||
switch typ := spec.Type.(type) {
|
||||
|
|
@ -808,7 +814,6 @@ func (pkg *Package) printMethodDoc(symbol, method string) bool {
|
|||
for _, meth := range typ.Methods {
|
||||
if match(method, meth.Name) {
|
||||
decl := meth.Decl
|
||||
decl.Body = nil
|
||||
pkg.emit(meth.Doc, decl)
|
||||
found = true
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue