From: Robert Griesemer Date: Mon, 14 Jan 2013 19:01:27 +0000 (-0800) Subject: go/types: mark completely imported packages as such X-Git-Tag: go1.1rc2~1391 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6c3736a527f6c71de0c6503ce3aa948fef592393;p=gostls13.git go/types: mark completely imported packages as such R=adonovan CC=golang-dev https://golang.org/cl/7103055 --- diff --git a/src/pkg/go/types/check.go b/src/pkg/go/types/check.go index 33b9c7e2b4..3b13b0fcd3 100644 --- a/src/pkg/go/types/check.go +++ b/src/pkg/go/types/check.go @@ -418,19 +418,7 @@ func check(ctxt *Context, fset *token.FileSet, files []*ast.File) (pkg *Package, // resolve identifiers imp := ctxt.Import if imp == nil { - // wrap GcImport to import packages only once by default. - // TODO(gri) move this into resolve - imported := make(map[string]bool) - imp = func(imports map[string]*Package, path string) (*Package, error) { - if imported[path] && imports[path] != nil { - return imports[path], nil - } - pkg, err := GcImport(imports, path) - if err == nil { - imported[path] = true - } - return pkg, err - } + imp = GcImport } pkg, methods := check.resolve(imp) check.pkg = pkg diff --git a/src/pkg/go/types/gcimporter.go b/src/pkg/go/types/gcimporter.go index 31ff68ce6f..edd3e4dec7 100644 --- a/src/pkg/go/types/gcimporter.go +++ b/src/pkg/go/types/gcimporter.go @@ -77,10 +77,13 @@ func FindPkg(path, srcDir string) (filename, id string) { // adds the corresponding package object to the imports map indexed by id, // and returns the object. // -// The imports map must contains all packages already imported, and no map -// entry with id as the key must be present. The data reader position must -// be the beginning of the export data section. The filename is only used -// in error messages. +// The imports map must contains all packages already imported. The data +// reader position must be the beginning of the export data section. The +// filename is only used in error messages. +// +// If imports[id] contains the completely imported package, that package +// can be used directly, and there is no need to call this function (but +// there is also no harm but for extra time used). // func GcImportData(imports map[string]*Package, filename, id string, data *bufio.Reader) (pkg *Package, err error) { // support for gcParser error handling @@ -118,12 +121,10 @@ func GcImport(imports map[string]*Package, path string) (pkg *Package, err error return } - // Note: imports[id] may already contain a partially imported package. - // We must continue doing the full import here since we don't - // know if something is missing. - // TODO: There's no need to re-import a package if we know that we - // have done a full import before. At the moment we cannot - // tell from the available information in this function alone. + // no need to re-import if the package was imported completely before + if pkg = imports[id]; pkg != nil && pkg.Complete { + return + } // open file f, err := os.Open(filename) @@ -900,5 +901,8 @@ func (p *gcParser) parseExport() *Package { p.errorf("expected no scanner errors, got %d", n) } + // package was imported completely and without errors + pkg.Complete = true + return pkg } diff --git a/src/pkg/go/types/objects.go b/src/pkg/go/types/objects.go index 6f4b5cfc31..dcd905b413 100644 --- a/src/pkg/go/types/objects.go +++ b/src/pkg/go/types/objects.go @@ -23,10 +23,11 @@ type Object interface { // A Package represents the contents (objects) of a Go package. type Package struct { - Name string - Path string // import path, "" for current (non-imported) package - Scope *Scope // package-level scope - Imports map[string]*Package // map of import paths to imported packages + Name string + Path string // import path, "" for current (non-imported) package + Scope *Scope // package-level scope + Imports map[string]*Package // map of import paths to imported packages + Complete bool // if set, this package was imported completely spec *ast.ImportSpec }