if pkg == &importing {
return nil, fmt.Errorf("import cycle through package %q", bp.ImportPath)
}
- if pkg.Complete() {
- return pkg, nil
+ if !pkg.Complete() {
+ // package exists but is not complete - we cannot handle this
+ // at the moment since the source importer replaces the package
+ // wholesale rather than augmenting it (see #19337 for details)
+ return nil, fmt.Errorf("reimported partially imported package %q", bp.ImportPath)
}
- } else {
- p.packages[bp.ImportPath] = &importing
- defer func() {
- // clean up in case of error
- // TODO(gri) Eventually we may want to leave a (possibly empty)
- // package in the map in all cases (and use that package to
- // identify cycles). See also issue 16088.
- if p.packages[bp.ImportPath] == &importing {
- p.packages[bp.ImportPath] = nil
- }
- }()
+ return pkg, nil
}
+ p.packages[bp.ImportPath] = &importing
+ defer func() {
+ // clean up in case of error
+ // TODO(gri) Eventually we may want to leave a (possibly empty)
+ // package in the map in all cases (and use that package to
+ // identify cycles). See also issue 16088.
+ if p.packages[bp.ImportPath] == &importing {
+ p.packages[bp.ImportPath] = nil
+ }
+ }()
+
// collect package files
bp, err = p.ctxt.ImportDir(bp.Dir, 0)
if err != nil {
}
}
}
+
+func TestReimport(t *testing.T) {
+ if runtime.GOOS == "nacl" {
+ t.Skip("no source code available")
+ }
+
+ // Reimporting a partially imported (incomplete) package is not supported (see issue #19337).
+ // Make sure we recognize the situation and report an error.
+
+ mathPkg := types.NewPackage("math", "math") // incomplete package
+ importer := New(&build.Default, token.NewFileSet(), map[string]*types.Package{mathPkg.Path(): mathPkg})
+ _, err := importer.ImportFrom("math", ".", 0)
+ if err == nil || !strings.HasPrefix(err.Error(), "reimport") {
+ t.Errorf("got %v; want reimport error", err)
+ }
+}