aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/doc
diff options
context:
space:
mode:
authorelpinal <6elpinal@gmail.com>2017-12-16 15:04:05 +0900
committerRobert Griesemer <gri@golang.org>2017-12-20 19:05:19 +0000
commit0504cd68e6561b962354821bccf04f5cf080662e (patch)
treeebf7c6e98ff920393f03d8fec93e5aa445927c5d /src/cmd/doc
parent9c64c65d0ea251c3ac4d49556f10ad6ceb532f52 (diff)
downloadgo-0504cd68e6561b962354821bccf04f5cf080662e.tar.xz
cmd/doc: suppress the error message for *package.ident embedded in struct type
The current implementation prints a log, "invalid program: unexpected type for embedded field", when the form *package.ident is embedded in a struct declaration. Note that since valid qualified identifiers must be exported, the result for a valid program does not change. Change-Id: If8b9d7056c56b6a6c5482eb749168a63c65ef685 Reviewed-on: https://go-review.googlesource.com/84436 Reviewed-by: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/doc')
-rw-r--r--src/cmd/doc/doc_test.go1
-rw-r--r--src/cmd/doc/pkg.go17
-rw-r--r--src/cmd/doc/testdata/pkg.go17
3 files changed, 19 insertions, 16 deletions
diff --git a/src/cmd/doc/doc_test.go b/src/cmd/doc/doc_test.go
index ee7c430cbd..07e59a2d3e 100644
--- a/src/cmd/doc/doc_test.go
+++ b/src/cmd/doc/doc_test.go
@@ -292,6 +292,7 @@ var tests = []test{
`unexportedField.*int.*Comment on line with unexported field.`,
`ExportedEmbeddedType.*Comment on line with exported embedded field.`,
`\*ExportedEmbeddedType.*Comment on line with exported embedded \*field.`,
+ `\*qualified.ExportedEmbeddedType.*Comment on line with exported embedded \*selector.field.`,
`unexportedType.*Comment on line with unexported embedded field.`,
`\*unexportedType.*Comment on line with unexported embedded \*field.`,
`io.Reader.*Comment on line with embedded Reader.`,
diff --git a/src/cmd/doc/pkg.go b/src/cmd/doc/pkg.go
index 99a00c5632..11011de018 100644
--- a/src/cmd/doc/pkg.go
+++ b/src/cmd/doc/pkg.go
@@ -702,9 +702,16 @@ func trimUnexportedFields(fields *ast.FieldList, isInterface bool) *ast.FieldLis
for _, field := range fields.List {
names := field.Names
if len(names) == 0 {
- // Embedded type. Use the name of the type. It must be of type ident or *ident.
+ // Embedded type. Use the name of the type. It must be of the form ident or
+ // pkg.ident (for structs and interfaces), or *ident or *pkg.ident (structs only).
// Nothing else is allowed.
- switch ident := field.Type.(type) {
+ ty := field.Type
+ if se, ok := field.Type.(*ast.StarExpr); !isInterface && ok {
+ // The form *ident or *pkg.ident is only valid on
+ // embedded types in structs.
+ ty = se.X
+ }
+ switch ident := ty.(type) {
case *ast.Ident:
if isInterface && ident.Name == "error" && ident.Obj == nil {
// For documentation purposes, we consider the builtin error
@@ -714,12 +721,6 @@ func trimUnexportedFields(fields *ast.FieldList, isInterface bool) *ast.FieldLis
continue
}
names = []*ast.Ident{ident}
- case *ast.StarExpr:
- // Must have the form *identifier.
- // This is only valid on embedded types in structs.
- if ident, ok := ident.X.(*ast.Ident); ok && !isInterface {
- names = []*ast.Ident{ident}
- }
case *ast.SelectorExpr:
// An embedded type may refer to a type in another package.
names = []*ast.Ident{ident.Sel}
diff --git a/src/cmd/doc/testdata/pkg.go b/src/cmd/doc/testdata/pkg.go
index d0995bbf7d..bc069939f8 100644
--- a/src/cmd/doc/testdata/pkg.go
+++ b/src/cmd/doc/testdata/pkg.go
@@ -60,14 +60,15 @@ func internalFunc(a int) bool
// Comment about exported type.
type ExportedType struct {
// Comment before exported field.
- ExportedField int // Comment on line with exported field.
- unexportedField int // Comment on line with unexported field.
- ExportedEmbeddedType // Comment on line with exported embedded field.
- *ExportedEmbeddedType // Comment on line with exported embedded *field.
- unexportedType // Comment on line with unexported embedded field.
- *unexportedType // Comment on line with unexported embedded *field.
- io.Reader // Comment on line with embedded Reader.
- error // Comment on line with embedded error.
+ ExportedField int // Comment on line with exported field.
+ unexportedField int // Comment on line with unexported field.
+ ExportedEmbeddedType // Comment on line with exported embedded field.
+ *ExportedEmbeddedType // Comment on line with exported embedded *field.
+ *qualified.ExportedEmbeddedType // Comment on line with exported embedded *selector.field.
+ unexportedType // Comment on line with unexported embedded field.
+ *unexportedType // Comment on line with unexported embedded *field.
+ io.Reader // Comment on line with embedded Reader.
+ error // Comment on line with embedded error.
}
// Comment about exported method.