]> Cypherpunks repositories - gostls13.git/commitdiff
fix long-standing bug in doc reader:
authorRobert Griesemer <gri@golang.org>
Sat, 1 Aug 2009 01:40:11 +0000 (18:40 -0700)
committerRobert Griesemer <gri@golang.org>
Sat, 1 Aug 2009 01:40:11 +0000 (18:40 -0700)
- replace forward-declared types with complete
  declaration when it is found

R=rsc
DELTA=23  (15 added, 0 deleted, 8 changed)
OCL=32618
CL=32618

src/pkg/go/doc/doc.go

index 287677aa005b36ce378f0ea198de856c9dd13351..634bd0ce91c6a527c69e7781ef7f82ba7a522837 100644 (file)
@@ -72,15 +72,30 @@ func (doc *docReader) lookupTypeDoc(typ ast.Expr) *typeDoc {
 }
 
 
+func isForwardDecl(typ ast.Expr) bool {
+       switch t := typ.(type) {
+       case *ast.StructType:
+               return t.Fields == nil;
+       case *ast.InterfaceType:
+               return t.Methods == nil;
+       }
+       return false;
+}
+
+
 func (doc *docReader) addType(decl *ast.GenDecl) {
-       typ := decl.Specs[0].(*ast.TypeSpec);
-       name := typ.Name.Value;
-       if _, found := doc.types[name]; !found {
-               tdoc := &typeDoc{decl, make(map[string] *ast.FuncDecl), make(map[string] *ast.FuncDecl)};
-               doc.types[name] = tdoc;
+       spec := decl.Specs[0].(*ast.TypeSpec);
+       name := spec.Name.Value;
+       if tdoc, found := doc.types[name]; found {
+               if !isForwardDecl(tdoc.decl.Specs[0].(*ast.TypeSpec).Type) || isForwardDecl(spec.Type) {
+                       // existing type was not a forward-declaration or the
+                       // new type is a forward declaration - leave it alone
+                       return;
+               }
+               // replace existing type
        }
-       // If the type was found it may have been added as a forward
-       // declaration before, or this is a forward-declaration.
+       tdoc := &typeDoc{decl, make(map[string] *ast.FuncDecl), make(map[string] *ast.FuncDecl)};
+       doc.types[name] = tdoc;
 }