]> Cypherpunks repositories - gostls13.git/commitdiff
- bug fix: do not strip lower-case parameter and result names in signatures
authorRobert Griesemer <gri@golang.org>
Mon, 6 Jul 2009 18:39:48 +0000 (11:39 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 6 Jul 2009 18:39:48 +0000 (11:39 -0700)
- 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

src/pkg/go/ast/filter.go

index cf65f4ae65eab905c45b13d4d39d76b534966366..a9dd08015223acac69af68c579fbdef736bd07ac 100644 (file)
@@ -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);