refactor/rename: fix crash with "." as -from package

Cause: the absolute cwd, not ".", must be passed to build.Import.

Also: simplify the lookup logic in findFromObjects, and handle nil
gracefully.

(No unit test---not worth faking os.Getwd.)

Fixes issue #13866

Change-Id: I7e8eede55bc83d98e2ef5e42609c287e74c04501
Reviewed-on: https://go-review.googlesource.com/18453
Reviewed-by: Michael Matloob <matloob@golang.org>
This commit is contained in:
Alan Donovan 2016-01-08 14:13:35 -05:00
parent 1fb1f857ac
commit e211dfb000
2 changed files with 30 additions and 16 deletions

View File

@ -116,9 +116,13 @@ func parseFromFlag(ctxt *build.Context, fromFlag string) (*spec, error) {
spec.fromName = spec.searchFor
}
cwd, err := os.Getwd()
if err != nil {
return nil, err
}
// Sanitize the package.
// TODO(adonovan): test with relative packages. May need loader changes.
bp, err := ctxt.Import(spec.pkg, ".", build.FindOnly)
bp, err := ctxt.Import(spec.pkg, cwd, build.FindOnly)
if err != nil {
return nil, fmt.Errorf("can't find package %q", spec.pkg)
}
@ -274,20 +278,23 @@ func findFromObjects(iprog *loader.Program, spec *spec) ([]types.Object, error)
// for main packages, even though that's not an import path.
// Seems like a bug.
//
// pkgObj := iprog.ImportMap[spec.pkg]
// if pkgObj == nil {
// pkg := iprog.ImportMap[spec.pkg]
// if pkg == nil {
// return fmt.Errorf("cannot find package %s", spec.pkg) // can't happen?
// }
// info := iprog.AllPackages[pkg]
// Workaround: lookup by value.
var pkgObj *types.Package
for pkg := range iprog.AllPackages {
var info *loader.PackageInfo
var pkg *types.Package
for pkg, info = range iprog.AllPackages {
if pkg.Path() == spec.pkg {
pkgObj = pkg
break
}
}
info := iprog.AllPackages[pkgObj]
if info == nil {
return nil, fmt.Errorf("package %q was not loaded", spec.pkg)
}
objects, err := findObjects(info, spec)
if err != nil {

View File

@ -116,9 +116,13 @@ func parseFromFlag(ctxt *build.Context, fromFlag string) (*spec, error) {
spec.fromName = spec.searchFor
}
cwd, err := os.Getwd()
if err != nil {
return nil, err
}
// Sanitize the package.
// TODO(adonovan): test with relative packages. May need loader changes.
bp, err := ctxt.Import(spec.pkg, ".", build.FindOnly)
bp, err := ctxt.Import(spec.pkg, cwd, build.FindOnly)
if err != nil {
return nil, fmt.Errorf("can't find package %q", spec.pkg)
}
@ -274,20 +278,23 @@ func findFromObjects(iprog *loader.Program, spec *spec) ([]types.Object, error)
// for main packages, even though that's not an import path.
// Seems like a bug.
//
// pkgObj := iprog.ImportMap[spec.pkg]
// if pkgObj == nil {
// pkg := iprog.ImportMap[spec.pkg]
// if pkg == nil {
// return fmt.Errorf("cannot find package %s", spec.pkg) // can't happen?
// }
// info := iprog.AllPackages[pkg]
// Workaround: lookup by value.
var pkgObj *types.Package
for pkg := range iprog.AllPackages {
var info *loader.PackageInfo
var pkg *types.Package
for pkg, info = range iprog.AllPackages {
if pkg.Path() == spec.pkg {
pkgObj = pkg
break
}
}
info := iprog.AllPackages[pkgObj]
if info == nil {
return nil, fmt.Errorf("package %q was not loaded", spec.pkg)
}
objects, err := findObjects(info, spec)
if err != nil {