mirror of
https://github.com/golang/go
synced 2024-11-23 19:40:08 -07:00
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: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
2638001e12
commit
5f0a9ba134
@ -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.
|
||||
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) {
|
||||
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,
|
||||
@ -62,23 +62,10 @@ func (p *Importer) ImportFrom(path, srcDir string, mode types.ImportMode) (*type
|
||||
panic("non-zero import mode")
|
||||
}
|
||||
|
||||
// determine package path (do vendor resolution)
|
||||
var bp *build.Package
|
||||
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)
|
||||
if abs, err := p.absPath(srcDir); err == nil { // see issue #14282
|
||||
srcDir = abs
|
||||
}
|
||||
bp, err := p.ctxt.Import(path, srcDir, 0)
|
||||
if err != nil {
|
||||
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
|
||||
}
|
||||
}()
|
||||
|
||||
// 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
|
||||
filenames = append(filenames, bp.GoFiles...)
|
||||
filenames = append(filenames, bp.CgoFiles...)
|
||||
|
@ -10,6 +10,7 @@ import (
|
||||
"go/types"
|
||||
"internal/testenv"
|
||||
"io/ioutil"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
@ -200,3 +201,34 @@ func TestIssue20855(t *testing.T) {
|
||||
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")
|
||||
}
|
||||
|
5
src/go/internal/srcimporter/testdata/issue23092/issue23092.go
vendored
Normal file
5
src/go/internal/srcimporter/testdata/issue23092/issue23092.go
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
// 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
|
5
src/go/internal/srcimporter/testdata/issue24392/issue24392.go
vendored
Normal file
5
src/go/internal/srcimporter/testdata/issue24392/issue24392.go
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
// 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
|
Loading…
Reference in New Issue
Block a user