diff options
Diffstat (limited to 'src/pkg/go/doc/doc.go')
-rw-r--r-- | src/pkg/go/doc/doc.go | 158 |
1 files changed, 87 insertions, 71 deletions
diff --git a/src/pkg/go/doc/doc.go b/src/pkg/go/doc/doc.go index 9b6b34d6b..130533ebd 100644 --- a/src/pkg/go/doc/doc.go +++ b/src/pkg/go/doc/doc.go @@ -18,11 +18,11 @@ import ( type typeDoc struct { // len(decl.Specs) == 1, and the element type is *ast.TypeSpec // if the type declaration hasn't been seen yet, decl is nil - decl *ast.GenDecl; + decl *ast.GenDecl; // values, factory functions, and methods associated with the type - values *vector.Vector; // list of *ast.GenDecl (consts and vars) - factories map[string] *ast.FuncDecl; - methods map[string] *ast.FuncDecl; + values *vector.Vector; // list of *ast.GenDecl (consts and vars) + factories map[string]*ast.FuncDecl; + methods map[string]*ast.FuncDecl; } @@ -34,18 +34,18 @@ type typeDoc struct { // printing the corresponding AST node). // type docReader struct { - doc *ast.CommentGroup; // package documentation, if any - values *vector.Vector; // list of *ast.GenDecl (consts and vars) - types map[string] *typeDoc; - funcs map[string] *ast.FuncDecl; - bugs *vector.Vector; // list of *ast.CommentGroup + doc *ast.CommentGroup; // package documentation, if any + values *vector.Vector; // list of *ast.GenDecl (consts and vars) + types map[string]*typeDoc; + funcs map[string]*ast.FuncDecl; + bugs *vector.Vector; // list of *ast.CommentGroup } func (doc *docReader) init() { doc.values = vector.New(0); - doc.types = make(map[string] *typeDoc); - doc.funcs = make(map[string] *ast.FuncDecl); + doc.types = make(map[string]*typeDoc); + doc.funcs = make(map[string]*ast.FuncDecl); doc.bugs = vector.New(0); } @@ -65,13 +65,13 @@ func (doc *docReader) addType(decl *ast.GenDecl) { func (doc *docReader) lookupTypeDoc(name string) *typeDoc { if name == "" { - return nil; // no type docs for anonymous types + return nil; // no type docs for anonymous types } if tdoc, found := doc.types[name]; found { return tdoc; } // type wasn't found - add one without declaration - tdoc := &typeDoc{nil, vector.New(0), make(map[string] *ast.FuncDecl), make(map[string] *ast.FuncDecl)}; + tdoc := &typeDoc{nil, vector.New(0), make(map[string]*ast.FuncDecl), make(map[string]*ast.FuncDecl)}; doc.types[name] = tdoc; return tdoc; } @@ -136,7 +136,7 @@ func (doc *docReader) addValue(decl *ast.GenDecl) { // typed entries are sufficiently frequent typ := doc.lookupTypeDoc(domName); if typ != nil { - values = typ.values; // associate with that type + values = typ.values; // associate with that type } } @@ -207,7 +207,7 @@ func (doc *docReader) addDecl(decl ast.Decl) { // would lose GenDecl documentation if the TypeSpec // has documentation as well. doc.addType(&ast.GenDecl{d.Doc, d.Pos(), token.TYPE, noPos, []ast.Spec{spec}, noPos}); - // A new GenDecl node is created, no need to nil out d.Doc. + // A new GenDecl node is created, no need to nil out d.Doc. } } } @@ -228,8 +228,8 @@ func copyCommentList(list []*ast.Comment) []*ast.Comment { var ( // Regexp constructor needs threads - cannot use init expressions - bug_markers *regexp.Regexp; - bug_content *regexp.Regexp; + bug_markers *regexp.Regexp; + bug_content *regexp.Regexp; ) func makeRex(s string) *regexp.Regexp { @@ -245,8 +245,8 @@ func makeRex(s string) *regexp.Regexp { // func (doc *docReader) addFile(src *ast.File) { if bug_markers == nil { - bug_markers = makeRex("^/[/*][ \t]*BUG\\(.*\\):[ \t]*"); // BUG(uid): - bug_content = makeRex("[^ \n\r\t]+"); // at least one non-whitespace char + bug_markers = makeRex("^/[/*][ \t]*BUG\\(.*\\):[ \t]*"); // BUG(uid): + bug_content = makeRex("[^ \n\r\t]+"); // at least one non-whitespace char } // add package documentation @@ -257,7 +257,7 @@ func (doc *docReader) addFile(src *ast.File) { // comments correctly (but currently looses BUG(...) // comments). doc.doc = src.Doc; - src.Doc = nil; // doc consumed - remove from ast.File node + src.Doc = nil; // doc consumed - remove from ast.File node } // add all declarations @@ -271,15 +271,15 @@ func (doc *docReader) addFile(src *ast.File) { cstr := string(text); if m := bug_markers.ExecuteString(cstr); len(m) > 0 { // found a BUG comment; maybe empty - if bstr := cstr[m[1] : len(cstr)]; bug_content.MatchString(bstr) { + if bstr := cstr[m[1]:len(cstr)]; bug_content.MatchString(bstr) { // non-empty BUG comment; collect comment without BUG prefix list := copyCommentList(c.List); - list[0].Text = text[m[1] : len(text)]; + list[0].Text = text[m[1]:len(text)]; doc.bugs.Push(&ast.CommentGroup{list, nil}); } } } - src.Comments = nil; // consumed unassociated comments - remove from ast.File node + src.Comments = nil; // consumed unassociated comments - remove from ast.File node } @@ -312,19 +312,24 @@ func NewPackageDoc(pkg *ast.Package, importpath string) *PackageDoc { // values, either vars or consts. // type ValueDoc struct { - Doc string; - Decl *ast.GenDecl; - order int; + Doc string; + Decl *ast.GenDecl; + order int; } type sortValueDoc []*ValueDoc -func (p sortValueDoc) Len() int { return len(p); } -func (p sortValueDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i]; } + +func (p sortValueDoc) Len() int { + return len(p); +} +func (p sortValueDoc) Swap(i, j int) { + p[i], p[j] = p[j], p[i]; +} func declName(d *ast.GenDecl) string { if len(d.Specs) != 1 { - return "" + return ""; } switch v := d.Specs[0].(type) { @@ -350,17 +355,17 @@ func (p sortValueDoc) Less(i, j int) bool { func makeValueDocs(v *vector.Vector, tok token.Token) []*ValueDoc { - d := make([]*ValueDoc, v.Len()); // big enough in any case + d := make([]*ValueDoc, v.Len()); // big enough in any case n := 0; for i := range d { decl := v.At(i).(*ast.GenDecl); if decl.Tok == tok { d[n] = &ValueDoc{CommentText(decl.Doc), decl, i}; n++; - decl.Doc = nil; // doc consumed - removed from AST + decl.Doc = nil; // doc consumed - removed from AST } } - d = d[0 : n]; + d = d[0:n]; sort.Sort(sortValueDoc(d)); return d; } @@ -370,25 +375,32 @@ func makeValueDocs(v *vector.Vector, tok token.Token) []*ValueDoc { // either a top-level function or a method function. // type FuncDoc struct { - Doc string; - Recv ast.Expr; // TODO(rsc): Would like string here - Name string; - Decl *ast.FuncDecl; + Doc string; + Recv ast.Expr; // TODO(rsc): Would like string here + Name string; + Decl *ast.FuncDecl; } type sortFuncDoc []*FuncDoc -func (p sortFuncDoc) Len() int { return len(p); } -func (p sortFuncDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i]; } -func (p sortFuncDoc) Less(i, j int) bool { return p[i].Name < p[j].Name; } + +func (p sortFuncDoc) Len() int { + return len(p); +} +func (p sortFuncDoc) Swap(i, j int) { + p[i], p[j] = p[j], p[i]; +} +func (p sortFuncDoc) Less(i, j int) bool { + return p[i].Name < p[j].Name; +} -func makeFuncDocs(m map[string] *ast.FuncDecl) []*FuncDoc { +func makeFuncDocs(m map[string]*ast.FuncDecl) []*FuncDoc { d := make([]*FuncDoc, len(m)); i := 0; for _, f := range m { doc := new(FuncDoc); doc.Doc = CommentText(f.Doc); - f.Doc = nil; // doc consumed - remove from ast.FuncDecl node + f.Doc = nil; // doc consumed - remove from ast.FuncDecl node if f.Recv != nil { doc.Recv = f.Recv.Type; } @@ -407,19 +419,24 @@ func makeFuncDocs(m map[string] *ast.FuncDecl) []*FuncDoc { // Factories is a sorted list of factory functions that return that type. // Methods is a sorted list of method functions on that type. type TypeDoc struct { - Doc string; - Type *ast.TypeSpec; - Consts []*ValueDoc; - Vars []*ValueDoc; - Factories []*FuncDoc; - Methods []*FuncDoc; - Decl *ast.GenDecl; - order int; + Doc string; + Type *ast.TypeSpec; + Consts []*ValueDoc; + Vars []*ValueDoc; + Factories []*FuncDoc; + Methods []*FuncDoc; + Decl *ast.GenDecl; + order int; } type sortTypeDoc []*TypeDoc -func (p sortTypeDoc) Len() int { return len(p); } -func (p sortTypeDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i]; } + +func (p sortTypeDoc) Len() int { + return len(p); +} +func (p sortTypeDoc) Swap(i, j int) { + p[i], p[j] = p[j], p[i]; +} func (p sortTypeDoc) Less(i, j int) bool { // sort by name // pull blocks (name = "") up to top @@ -434,7 +451,7 @@ func (p sortTypeDoc) Less(i, j int) bool { // NOTE(rsc): This would appear not to be correct for type ( ) // blocks, but the doc extractor above has split them into // individual declarations. -func (doc *docReader) makeTypeDocs(m map[string] *typeDoc) []*TypeDoc { +func (doc *docReader) makeTypeDocs(m map[string]*typeDoc) []*TypeDoc { d := make([]*TypeDoc, len(m)); i := 0; for _, old := range m { @@ -445,12 +462,12 @@ func (doc *docReader) makeTypeDocs(m map[string] *typeDoc) []*TypeDoc { typespec := decl.Specs[0].(*ast.TypeSpec); t := new(TypeDoc); doc := typespec.Doc; - typespec.Doc = nil; // doc consumed - remove from ast.TypeSpec node + typespec.Doc = nil; // doc consumed - remove from ast.TypeSpec node if doc == nil { // no doc associated with the spec, use the declaration doc, if any doc = decl.Doc; } - decl.Doc = nil; // doc consumed - remove from ast.Decl node + decl.Doc = nil; // doc consumed - remove from ast.Decl node t.Doc = CommentText(doc); t.Type = typespec; t.Consts = makeValueDocs(old.values, token.CONST); @@ -482,7 +499,7 @@ func (doc *docReader) makeTypeDocs(m map[string] *typeDoc) []*TypeDoc { } } } - d = d[0 : i]; // some types may have been ignored + d = d[0:i]; // some types may have been ignored sort.Sort(sortTypeDoc(d)); return d; } @@ -500,16 +517,16 @@ func makeBugDocs(v *vector.Vector) []string { // PackageDoc is the documentation for an entire package. // type PackageDoc struct { - PackageName string; - ImportPath string; - FilePath string; - Filenames []string; - Doc string; - Consts []*ValueDoc; - Types []*TypeDoc; - Vars []*ValueDoc; - Funcs []*FuncDoc; - Bugs []string; + PackageName string; + ImportPath string; + FilePath string; + Filenames []string; + Doc string; + Consts []*ValueDoc; + Types []*TypeDoc; + Vars []*ValueDoc; + Funcs []*FuncDoc; + Bugs []string; } @@ -544,11 +561,11 @@ func isRegexp(s string) bool { for _, c := range s { for _, m := range metachars { if c == m { - return true + return true; } } } - return false + return false; } @@ -594,7 +611,7 @@ func filterValueDocs(a []*ValueDoc, names []string) []*ValueDoc { w++; } } - return a[0 : w]; + return a[0:w]; } @@ -606,7 +623,7 @@ func filterFuncDocs(a []*FuncDoc, names []string) []*FuncDoc { w++; } } - return a[0 : w]; + return a[0:w]; } @@ -627,7 +644,7 @@ func filterTypeDocs(a []*TypeDoc, names []string) []*TypeDoc { w++; } } - return a[0 : w]; + return a[0:w]; } @@ -643,4 +660,3 @@ func (p *PackageDoc) Filter(names []string) { p.Funcs = filterFuncDocs(p.Funcs, names); p.Doc = ""; // don't show top-level package doc } - |