Commit 5f0a9ba1 authored by Hiroshi Ioka's avatar Hiroshi Ioka Committed by Robert Griesemer

go/internal/srcimporter: simplify and fix package file lookup

The old code was a blend of (copied) code that existed before go/build,
and incorrect adjustments made when go/build was introduced. This change
leaves package path determination entirely to go/build and in the process
fixes issues with relative import paths.

Fixes #23092
Fixes #24392

Change-Id: I9e900538b365398751bace56964495c5440ac4ae
Reviewed-on: https://go-review.googlesource.com/83415
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
parent 2638001e
...@@ -46,9 +46,9 @@ func New(ctxt *build.Context, fset *token.FileSet, packages map[string]*types.Pa ...@@ -46,9 +46,9 @@ func New(ctxt *build.Context, fset *token.FileSet, packages map[string]*types.Pa
// for a package that is in the process of being imported. // for a package that is in the process of being imported.
var importing types.Package var importing types.Package
// Import(path) is a shortcut for ImportFrom(path, "", 0). // Import(path) is a shortcut for ImportFrom(path, ".", 0).
func (p *Importer) Import(path string) (*types.Package, error) { func (p *Importer) Import(path string) (*types.Package, error) {
return p.ImportFrom(path, "", 0) return p.ImportFrom(path, ".", 0) // use "." rather than "" (see issue #24441)
} }
// ImportFrom imports the package with the given import path resolved from the given srcDir, // ImportFrom imports the package with the given import path resolved from the given srcDir,
...@@ -62,23 +62,10 @@ func (p *Importer) ImportFrom(path, srcDir string, mode types.ImportMode) (*type ...@@ -62,23 +62,10 @@ func (p *Importer) ImportFrom(path, srcDir string, mode types.ImportMode) (*type
panic("non-zero import mode") panic("non-zero import mode")
} }
// determine package path (do vendor resolution) if abs, err := p.absPath(srcDir); err == nil { // see issue #14282
var bp *build.Package srcDir = abs
var err error
switch {
default:
if abs, err := p.absPath(srcDir); err == nil { // see issue #14282
srcDir = abs
}
bp, err = p.ctxt.Import(path, srcDir, build.FindOnly)
case build.IsLocalImport(path):
// "./x" -> "srcDir/x"
bp, err = p.ctxt.ImportDir(filepath.Join(srcDir, path), build.FindOnly)
case p.isAbsPath(path):
return nil, fmt.Errorf("invalid absolute import path %q", path)
} }
bp, err := p.ctxt.Import(path, srcDir, 0)
if err != nil { if err != nil {
return nil, err // err may be *build.NoGoError - return as is return nil, err // err may be *build.NoGoError - return as is
} }
...@@ -115,11 +102,6 @@ func (p *Importer) ImportFrom(path, srcDir string, mode types.ImportMode) (*type ...@@ -115,11 +102,6 @@ func (p *Importer) ImportFrom(path, srcDir string, mode types.ImportMode) (*type
} }
}() }()
// collect package files
bp, err = p.ctxt.ImportDir(bp.Dir, 0)
if err != nil {
return nil, err // err may be *build.NoGoError - return as is
}
var filenames []string var filenames []string
filenames = append(filenames, bp.GoFiles...) filenames = append(filenames, bp.GoFiles...)
filenames = append(filenames, bp.CgoFiles...) filenames = append(filenames, bp.CgoFiles...)
......
...@@ -10,6 +10,7 @@ import ( ...@@ -10,6 +10,7 @@ import (
"go/types" "go/types"
"internal/testenv" "internal/testenv"
"io/ioutil" "io/ioutil"
"path"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strings" "strings"
...@@ -200,3 +201,34 @@ func TestIssue20855(t *testing.T) { ...@@ -200,3 +201,34 @@ func TestIssue20855(t *testing.T) {
t.Error("got no package despite no hard errors") t.Error("got no package despite no hard errors")
} }
} }
func testImportPath(t *testing.T, pkgPath string) {
if !testenv.HasSrc() {
t.Skip("no source code available")
}
pkgName := path.Base(pkgPath)
pkg, err := importer.Import(pkgPath)
if err != nil {
t.Fatal(err)
}
if pkg.Name() != pkgName {
t.Errorf("got %q; want %q", pkg.Name(), pkgName)
}
if pkg.Path() != pkgPath {
t.Errorf("got %q; want %q", pkg.Path(), pkgPath)
}
}
// TestIssue23092 tests relative imports.
func TestIssue23092(t *testing.T) {
testImportPath(t, "./testdata/issue23092")
}
// TestIssue24392 tests imports against a path containing 'testdata'.
func TestIssue24392(t *testing.T) {
testImportPath(t, "go/internal/srcimporter/testdata/issue24392")
}
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package issue23092
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package issue24392
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment