mirror of
https://github.com/golang/go
synced 2024-11-19 16:54:44 -07:00
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>
This commit is contained in:
parent
9c64c65d0e
commit
0504cd68e6
@ -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.`,
|
||||
|
@ -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}
|
||||
|
17
src/cmd/doc/testdata/pkg.go
vendored
17
src/cmd/doc/testdata/pkg.go
vendored
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user