]> Cypherpunks repositories - gostls13.git/commitdiff
godoc: use file instead of file set for computing line info
authorRobert Griesemer <gri@golang.org>
Wed, 8 Dec 2010 05:55:32 +0000 (21:55 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 8 Dec 2010 05:55:32 +0000 (21:55 -0800)
Reduces indexing time by ~10%; from ~44s to ~39s, best of 3 runs.

R=rsc
CC=golang-dev
https://golang.org/cl/3510041

src/cmd/godoc/index.go

index 1fb0bbf518db719324aaa0967f4675133ae30700..b0bb8cef3bbfb8659c592d6611dd4e363e3da79b 100644 (file)
@@ -432,6 +432,7 @@ type Indexer struct {
        fset     *token.FileSet          // file set for all indexed files
        words    map[string]*IndexResult // RunLists of Spots
        snippets vector.Vector           // vector of *Snippets, indexed by snippet indices
+       current  *token.File             // last file added to file set
        file     *File                   // current file
        decl     ast.Decl                // current decl
        nspots   int                     // number of spots encountered
@@ -462,7 +463,7 @@ func (x *Indexer) visitIdent(kind SpotKind, id *ast.Ident) {
 
                if kind == Use || x.decl == nil {
                        // not a declaration or no snippet required
-                       info := makeSpotInfo(kind, x.fset.Position(id.Pos()).Line, false)
+                       info := makeSpotInfo(kind, x.current.Line(id.Pos()), false)
                        lists.Others.Push(Spot{x.file, info})
                } else {
                        // a declaration with snippet
@@ -608,6 +609,7 @@ func (x *Indexer) visitFile(dirname string, f *os.FileInfo) {
                return // ignore files with (parse) errors
        }
 
+       x.current = x.fset.File(file.Pos()) // file.Pos is in the current file
        dir, _ := pathutil.Split(path)
        pak := Pak{dir, file.Name.Name}
        x.file = &File{path, pak}
@@ -658,8 +660,9 @@ func NewIndex(dirnames <-chan string) *Index {
                }
        }
 
-       // the file set is not needed after indexing - help GC and clear it
+       // the file set and current file are not needed after indexing - help GC and clear them
        x.fset = nil
+       x.current = nil // contains reference to fset!
 
        // for each word, reduce the RunLists into a LookupResult;
        // also collect the word with its canonical spelling in a