mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/doc: trim unexported methods from interfaces
Fixes #10856. Change-Id: I5de65b8dd94eec3451ee0ba9c75698cdd88f5fea Reviewed-on: https://go-review.googlesource.com/10088 Reviewed-by: Andrew Gerrand <adg@golang.org>
This commit is contained in:
parent
fb7e2449b6
commit
83c7b60f27
1 changed files with 32 additions and 24 deletions
|
|
@ -345,7 +345,7 @@ func (pkg *Package) symbolDoc(symbol string) {
|
||||||
}
|
}
|
||||||
decl := typ.Decl
|
decl := typ.Decl
|
||||||
spec := pkg.findTypeSpec(decl, typ.Name)
|
spec := pkg.findTypeSpec(decl, typ.Name)
|
||||||
trimUnexportedFields(spec)
|
trimUnexportedElems(spec)
|
||||||
// If there are multiple types defined, reduce to just this one.
|
// If there are multiple types defined, reduce to just this one.
|
||||||
if len(decl.Specs) > 1 {
|
if len(decl.Specs) > 1 {
|
||||||
decl.Specs = []ast.Spec{spec}
|
decl.Specs = []ast.Spec{spec}
|
||||||
|
|
@ -366,22 +366,26 @@ func (pkg *Package) symbolDoc(symbol string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// trimUnexportedFields modifies spec in place to elide unexported fields (unless
|
// trimUnexportedElems modifies spec in place to elide unexported fields from
|
||||||
// the unexported flag is set). If spec is not a structure declartion, nothing happens.
|
// structs and methods from interfaces (unless the unexported flag is set).
|
||||||
func trimUnexportedFields(spec *ast.TypeSpec) {
|
func trimUnexportedElems(spec *ast.TypeSpec) {
|
||||||
if *unexported {
|
if *unexported {
|
||||||
// We're printing all fields.
|
return fields
|
||||||
return
|
|
||||||
}
|
}
|
||||||
// It must be a struct for us to care. (We show unexported methods in interfaces.)
|
switch typ := spec.Type.(type) {
|
||||||
structType, ok := spec.Type.(*ast.StructType)
|
case *ast.StructType:
|
||||||
if !ok {
|
typ.Fields = trimUnexportedFields(typ.Fields, "fields")
|
||||||
return
|
case *ast.InterfaceType:
|
||||||
|
typ.Methods = trimUnexportedFields(typ.Methods, "methods")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// trimUnexportedFields returns the field list trimmed of unexported fields.
|
||||||
|
func trimUnexportedFields(fields *ast.FieldList, what string) *ast.FieldList {
|
||||||
trimmed := false
|
trimmed := false
|
||||||
list := make([]*ast.Field, 0, len(structType.Fields.List))
|
list := make([]*ast.Field, 0, len(fields.List))
|
||||||
for _, field := range structType.Fields.List {
|
for _, field := range fields.List {
|
||||||
// Trims if any is unexported. Fine in practice.
|
// Trims if any is unexported. Good enough in practice.
|
||||||
ok := true
|
ok := true
|
||||||
for _, name := range field.Names {
|
for _, name := range field.Names {
|
||||||
if !isExported(name.Name) {
|
if !isExported(name.Name) {
|
||||||
|
|
@ -394,19 +398,23 @@ func trimUnexportedFields(spec *ast.TypeSpec) {
|
||||||
list = append(list, field)
|
list = append(list, field)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if trimmed {
|
if !trimmed {
|
||||||
|
return fields
|
||||||
|
}
|
||||||
unexportedField := &ast.Field{
|
unexportedField := &ast.Field{
|
||||||
Type: ast.NewIdent(""), // Hack: printer will treat this as a field with a named type.
|
Type: ast.NewIdent(""), // Hack: printer will treat this as a field with a named type.
|
||||||
Comment: &ast.CommentGroup{
|
Comment: &ast.CommentGroup{
|
||||||
List: []*ast.Comment{
|
List: []*ast.Comment{
|
||||||
&ast.Comment{
|
&ast.Comment{
|
||||||
Text: "// Has unexported fields.\n",
|
Text: fmt.Sprintf("// Has unexported %s.\n", what),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
list = append(list, unexportedField)
|
return &ast.FieldList{
|
||||||
structType.Fields.List = list
|
Opening: fields.Opening,
|
||||||
|
List: append(list, unexportedField),
|
||||||
|
Closing: fields.Closing,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue