From: elpinal <6elpinal@gmail.com> Date: Sat, 16 Dec 2017 06:04:05 +0000 (+0900) Subject: cmd/doc: suppress the error message for *package.ident embedded in struct type X-Git-Tag: go1.10beta2~88 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0504cd68e6561b962354821bccf04f5cf080662e;p=gostls13.git 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 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot --- 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.