From: Robert Griesemer Date: Sat, 1 Aug 2009 01:40:11 +0000 (-0700) Subject: fix long-standing bug in doc reader: X-Git-Tag: weekly.2009-11-06~993 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=22ec53992034d3e33fb220183d3416869546fbf5;p=gostls13.git fix long-standing bug in doc reader: - 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 --- diff --git a/src/pkg/go/doc/doc.go b/src/pkg/go/doc/doc.go index 287677aa00..634bd0ce91 100644 --- a/src/pkg/go/doc/doc.go +++ b/src/pkg/go/doc/doc.go @@ -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; }