]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: mark completely imported packages as such
authorRobert Griesemer <gri@golang.org>
Mon, 14 Jan 2013 19:01:27 +0000 (11:01 -0800)
committerRobert Griesemer <gri@golang.org>
Mon, 14 Jan 2013 19:01:27 +0000 (11:01 -0800)
R=adonovan
CC=golang-dev
https://golang.org/cl/7103055

src/pkg/go/types/check.go
src/pkg/go/types/gcimporter.go
src/pkg/go/types/objects.go

index 33b9c7e2b4b95c0828b897f993661bc51b9fa54e..3b13b0fcd30a59fe4dbf46167b010a1e0de4c33f 100644 (file)
@@ -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
index 31ff68ce6fcda4b84a4ecbb32b0136e4d6e2f0b8..edd3e4dec7d595440e0bc5548bb1bddbe17a1594 100644 (file)
@@ -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
 }
index 6f4b5cfc31638db8f4710fc4466094f477bb9c6f..dcd905b4138d65f807ba327e01c4095c2c474bce 100644 (file)
@@ -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
 }