1
0
mirror of https://github.com/golang/go synced 2024-11-22 11:54:50 -07:00

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
This commit is contained in:
Robert Griesemer 2009-07-31 18:40:11 -07:00
parent 7539c8501d
commit 22ec539920

View File

@ -72,15 +72,30 @@ func (doc *docReader) lookupTypeDoc(typ ast.Expr) *typeDoc {
}
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;
func isForwardDecl(typ ast.Expr) bool {
switch t := typ.(type) {
case *ast.StructType:
return t.Fields == nil;
case *ast.InterfaceType:
return t.Methods == nil;
}
// If the type was found it may have been added as a forward
// declaration before, or this is a forward-declaration.
return false;
}
func (doc *docReader) addType(decl *ast.GenDecl) {
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
}
tdoc := &typeDoc{decl, make(map[string] *ast.FuncDecl), make(map[string] *ast.FuncDecl)};
doc.types[name] = tdoc;
}