diff options
| author | Brad Fitzpatrick <bradfitz@golang.org> | 2012-11-19 13:50:20 -0800 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2012-11-19 13:50:20 -0800 |
| commit | aeca7a7cd21cb512ac19fa2f8d0555fb13bdd8f3 (patch) | |
| tree | a1f8748673d278a751c9d043590985ed10f30787 /src/cmd/api/goapi.go | |
| parent | c00bda13528c47b604595b17d76cf4b89425f632 (diff) | |
| download | go-aeca7a7cd21cb512ac19fa2f8d0555fb13bdd8f3.tar.xz | |
cmd/api: speed up API check by 2x, caching parser.ParseFile calls
Saves 5 seconds on my machine. If Issue 4380 is fixed this
clone can be removed.
Update #4380
R=golang-dev, remyoudompheng, minux.ma, gri
CC=golang-dev
https://golang.org/cl/6845058
Diffstat (limited to 'src/cmd/api/goapi.go')
| -rw-r--r-- | src/cmd/api/goapi.go | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index 9b7e090277..a61497c52d 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -353,6 +353,21 @@ func fileDeps(f *ast.File) (pkgs []string) { return } +var parsedFileCache = make(map[string]*ast.File) + +func parseFile(filename string) (*ast.File, error) { + f, ok := parsedFileCache[filename] + if !ok { + var err error + f, err = parser.ParseFile(fset, filename, nil, 0) + if err != nil { + return nil, err + } + parsedFileCache[filename] = f + } + return clone(f).(*ast.File), nil +} + // WalkPackage walks all files in package `name'. // WalkPackage does nothing if the package has already been loaded. func (w *Walker) WalkPackage(name string) { @@ -386,7 +401,7 @@ func (w *Walker) WalkPackage(name string) { files := append(append([]string{}, info.GoFiles...), info.CgoFiles...) for _, file := range files { - f, err := parser.ParseFile(fset, filepath.Join(dir, file), nil, 0) + f, err := parseFile(filepath.Join(dir, file)) if err != nil { log.Fatalf("error parsing package %s, file %s: %v", name, file, err) } |
