Commit 4f40f5ea authored by Robert Griesemer's avatar Robert Griesemer

- bug fix: do not strip lower-case parameter and result names in signatures

- display: show '...' if a struct/interface has fields/methods removed; show
  struct/interface w/o {}'s if all fields/methods were removed; and show the
  {}'s if the struct/interface was empty to begin with

R=rsc
DELTA=41  (36 added, 0 deleted, 5 changed)
OCL=31201
CL=31204
parent d3a2925b
......@@ -4,7 +4,10 @@
package ast
import "go/ast"
import (
"go/ast";
"go/token";
)
func filterIdentList(list []*Ident) []*Ident {
......@@ -39,21 +42,54 @@ func filterFieldList(list []*Field) []*Field {
j++;
}
}
if j > 0 && j < len(list) {
// fields have been stripped but there is at least one left;
// add a '...' anonymous field instead
list[j] = &ast.Field{nil, nil, &ast.Ellipsis{}, nil, nil};
j++;
}
return list[0 : j];
}
func filterParamList(list []*Field) {
for _, f := range list {
filterType(f.Type);
}
}
var noPos token.Position;
func filterType(typ Expr) {
switch t := typ.(type) {
case *ArrayType:
filterType(t.Elt);
case *StructType:
t.Fields = filterFieldList(t.Fields);
// don't change if empty struct
if len(t.Fields) > 0 {
t.Fields = filterFieldList(t.Fields);
if len(t.Fields) == 0 {
// all fields have been stripped - make look like forward-decl
t.Lbrace = noPos;
t.Fields = nil;
t.Rbrace = noPos;
}
}
case *FuncType:
t.Params = filterFieldList(t.Params);
t.Results = filterFieldList(t.Results);
filterParamList(t.Params);
filterParamList(t.Results);
case *InterfaceType:
t.Methods = filterFieldList(t.Methods);
// don't change if empty interface
if len(t.Methods) > 0 {
t.Methods = filterFieldList(t.Methods);
if len(t.Methods) == 0 {
// all methods have been stripped - make look like forward-decl
t.Lbrace = noPos;
t.Methods = nil;
t.Rbrace = noPos;
}
}
case *MapType:
filterType(t.Key);
filterType(t.Value);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment