go/loader: resolve imports in "created" packages w.r.t. parent dir not cwd
Fixes golang/go#16580
Change-Id: Id891f40659257eac9dbb0d70dae17f725e911f9b
Reviewed-on: https://go-review.googlesource.com/33589
Reviewed-by: Robert Griesemer <gri@golang.org>
diff --git a/go/loader/loader.go b/go/loader/loader.go
index f0171fc..0d4c0d1 100644
--- a/go/loader/loader.go
+++ b/go/loader/loader.go
@@ -17,6 +17,7 @@
"go/token"
"go/types"
"os"
+ "path/filepath"
"sort"
"strings"
"sync"
@@ -132,6 +133,8 @@
// Files are processed first, but typically only one of Files and
// Filenames is provided. The path needn't be globally unique.
//
+// For vendoring purposes, the package's directory is the one that
+// contains the first file.
type PkgSpec struct {
Path string // package path ("" => use package declaration)
Files []*ast.File // ASTs of already-parsed files
@@ -586,9 +589,8 @@
imp.addFiles(info, files, false)
}
- createPkg := func(path string, files []*ast.File, errs []error) {
- // TODO(adonovan): fix: use dirname of files, not cwd.
- info := imp.newPackageInfo(path, conf.Cwd)
+ createPkg := func(path, dir string, files []*ast.File, errs []error) {
+ info := imp.newPackageInfo(path, dir)
for _, err := range errs {
info.appendError(err)
}
@@ -613,14 +615,19 @@
path = "(unnamed)"
}
}
- createPkg(path, files, errs)
+
+ dir := "."
+ if len(files) > 0 && files[0].Pos().IsValid() {
+ dir = filepath.Dir(conf.fset().File(files[0].Pos()).Name())
+ }
+ createPkg(path, dir, files, errs)
}
// Create external test packages.
sort.Sort(byImportPath(xtestPkgs))
for _, bp := range xtestPkgs {
files, errs := imp.conf.parsePackageFiles(bp, 'x')
- createPkg(bp.ImportPath+"_test", files, errs)
+ createPkg(bp.ImportPath+"_test", bp.Dir, files, errs)
}
// -- finishing up (sequential) ----------------------------------------