Commit 9a65a06e authored by Robert Griesemer's avatar Robert Griesemer

godoc: don't throw away function documentation

if there are multiple functions (for a package, type)
with the same name

Fixes #642.

R=rsc
CC=golang-dev
https://golang.org/cl/243041
parent e8a049b4
...@@ -147,6 +147,24 @@ func (doc *docReader) addValue(decl *ast.GenDecl) { ...@@ -147,6 +147,24 @@ func (doc *docReader) addValue(decl *ast.GenDecl) {
} }
// Helper function to set the table entry for function f. Makes sure that
// at least one f with associated documentation is stored in table, if there
// are multiple f's with the same name.
func setFunc(table map[string]*ast.FuncDecl, f *ast.FuncDecl) {
name := f.Name.Name()
if g, exists := table[name]; exists && g.Doc != nil {
// a function with the same name has already been registered;
// since it has documentation, assume f is simply another
// implementation and ignore it
// TODO(gri) consider collecting all functions, or at least
// all comments
return
}
// function doesn't exist or has no documentation; use f
table[name] = f
}
func (doc *docReader) addFunc(fun *ast.FuncDecl) { func (doc *docReader) addFunc(fun *ast.FuncDecl) {
name := fun.Name.Name() name := fun.Name.Name()
...@@ -156,7 +174,7 @@ func (doc *docReader) addFunc(fun *ast.FuncDecl) { ...@@ -156,7 +174,7 @@ func (doc *docReader) addFunc(fun *ast.FuncDecl) {
typ := doc.lookupTypeDoc(baseTypeName(fun.Recv.List[0].Type)) typ := doc.lookupTypeDoc(baseTypeName(fun.Recv.List[0].Type))
if typ != nil { if typ != nil {
// exported receiver type // exported receiver type
typ.methods[name] = fun setFunc(typ.methods, fun)
} }
// otherwise don't show the method // otherwise don't show the method
// TODO(gri): There may be exported methods of non-exported types // TODO(gri): There may be exported methods of non-exported types
...@@ -187,18 +205,18 @@ func (doc *docReader) addFunc(fun *ast.FuncDecl) { ...@@ -187,18 +205,18 @@ func (doc *docReader) addFunc(fun *ast.FuncDecl) {
if doc.pkgName == "os" && tname == "Error" && if doc.pkgName == "os" && tname == "Error" &&
name != "NewError" && name != "NewSyscallError" { name != "NewError" && name != "NewSyscallError" {
// not a factory function for os.Error // not a factory function for os.Error
doc.funcs[name] = fun // treat as ordinary function setFunc(doc.funcs, fun) // treat as ordinary function
return return
} }
typ.factories[name] = fun setFunc(typ.factories, fun)
return return
} }
} }
} }
// ordinary function // ordinary function
doc.funcs[name] = fun setFunc(doc.funcs, fun)
} }
......
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