internal/imports: remove go/packages support
We don't use the go/packages resolver in goimports, and as we develop
gopls it only becomes harder to use there. Give up.
Change-Id: Ic8b566c6dd730b23b0c81d7d34a41f16fe0be7e8
Reviewed-on: https://go-review.googlesource.com/c/tools/+/212630
Run-TryBot: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/imports/fix.go b/internal/imports/fix.go
index 818d443..e3f9dcb 100644
--- a/internal/imports/fix.go
+++ b/internal/imports/fix.go
@@ -27,7 +27,6 @@
"unicode/utf8"
"golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/packages"
"golang.org/x/tools/internal/gopathwalk"
)
@@ -725,9 +724,6 @@
GOPATH, GOROOT, GO111MODULE, GOPROXY, GOFLAGS, GOSUMDB string
WorkingDir string
- // If true, use go/packages regardless of the environment.
- ForceGoPackages bool
-
// Logf is the default logger for the ProcessEnv.
Logf func(format string, args ...interface{})
@@ -757,11 +753,6 @@
if e.resolver != nil {
return e.resolver
}
- if e.ForceGoPackages {
- e.resolver = &goPackagesResolver{env: e}
- return e.resolver
- }
-
out, err := e.invokeGo("env", "GOMOD")
if err != nil || len(bytes.TrimSpace(out.Bytes())) == 0 {
e.resolver = &gopathResolver{env: e}
@@ -771,14 +762,6 @@
return e.resolver
}
-func (e *ProcessEnv) newPackagesConfig(mode packages.LoadMode) *packages.Config {
- return &packages.Config{
- Mode: mode,
- Dir: e.WorkingDir,
- Env: e.env(),
- }
-}
-
func (e *ProcessEnv) buildContext() *build.Context {
ctx := build.Default
ctx.GOROOT = e.GOROOT
@@ -867,81 +850,6 @@
ClearForNewScan()
}
-// gopackagesResolver implements resolver for GOPATH and module workspaces using go/packages.
-type goPackagesResolver struct {
- env *ProcessEnv
-}
-
-func (r *goPackagesResolver) ClearForNewScan() {}
-
-func (r *goPackagesResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) {
- if len(importPaths) == 0 {
- return nil, nil
- }
- cfg := r.env.newPackagesConfig(packages.LoadFiles)
- pkgs, err := packages.Load(cfg, importPaths...)
- if err != nil {
- return nil, err
- }
- names := map[string]string{}
- for _, pkg := range pkgs {
- names[VendorlessPath(pkg.PkgPath)] = pkg.Name
- }
- // We may not have found all the packages. Guess the rest.
- for _, path := range importPaths {
- if _, ok := names[path]; ok {
- continue
- }
- names[path] = ImportPathToAssumedName(path)
- }
- return names, nil
-
-}
-
-func (r *goPackagesResolver) scan(refs references, _ bool, _ []gopathwalk.RootType) ([]*pkg, error) {
- var loadQueries []string
- for pkgName := range refs {
- loadQueries = append(loadQueries, "iamashamedtousethedisabledqueryname="+pkgName)
- }
- sort.Strings(loadQueries)
- cfg := r.env.newPackagesConfig(packages.LoadFiles)
- goPackages, err := packages.Load(cfg, loadQueries...)
- if err != nil {
- return nil, err
- }
-
- var scan []*pkg
- for _, goPackage := range goPackages {
- scan = append(scan, &pkg{
- dir: filepath.Dir(goPackage.CompiledGoFiles[0]),
- importPathShort: VendorlessPath(goPackage.PkgPath),
- goPackage: goPackage,
- packageName: goPackage.Name,
- })
- }
- return scan, nil
-}
-
-func (r *goPackagesResolver) loadExports(ctx context.Context, pkg *pkg) (string, []string, error) {
- if pkg.goPackage == nil {
- return "", nil, fmt.Errorf("goPackage not set")
- }
- var exports []string
- fset := token.NewFileSet()
- for _, fname := range pkg.goPackage.CompiledGoFiles {
- f, err := parser.ParseFile(fset, fname, nil, 0)
- if err != nil {
- return "", nil, fmt.Errorf("parsing %s: %v", fname, err)
- }
- for name := range f.Scope.Objects {
- if ast.IsExported(name) {
- exports = append(exports, name)
- }
- }
- }
- return pkg.goPackage.Name, exports, nil
-}
-
func addExternalCandidates(pass *pass, refs references, filename string) error {
dirScan, err := pass.env.GetResolver().scan(refs, false, nil)
if err != nil {
@@ -1138,7 +1046,6 @@
}
type pkg struct {
- goPackage *packages.Package
dir string // absolute file path to pkg directory ("/usr/lib/go/src/net/http")
importPathShort string // vendorless import path ("net/http", "a/b")
packageName string // package name loaded from source if requested
diff --git a/internal/imports/fix_test.go b/internal/imports/fix_test.go
index 327edeb..bf6c0fc 100644
--- a/internal/imports/fix_test.go
+++ b/internal/imports/fix_test.go
@@ -1576,10 +1576,9 @@
}
type testConfig struct {
- gopathOnly bool
- goPackagesIncompatible bool
- module packagestest.Module
- modules []packagestest.Module
+ gopathOnly bool
+ module packagestest.Module
+ modules []packagestest.Module
}
// fm is the type for a packagestest.Module's Files, abbreviated for shorter lines.
@@ -1592,37 +1591,12 @@
c.modules = []packagestest.Module{c.module}
}
- var kinds []string
for _, exporter := range packagestest.All {
- kinds = append(kinds, exporter.Name())
- kinds = append(kinds, exporter.Name()+"_GoPackages")
- }
- for _, kind := range kinds {
- t.Run(kind, func(t *testing.T) {
+ t.Run(exporter.Name(), func(t *testing.T) {
t.Helper()
-
- forceGoPackages := false
- var exporter packagestest.Exporter
- if c.gopathOnly && strings.HasPrefix(kind, "Modules") {
+ if c.gopathOnly && exporter.Name() == "Modules" {
t.Skip("test marked GOPATH-only")
}
- if c.goPackagesIncompatible && strings.HasSuffix(kind, "_GoPackages") {
- t.Skip("test marked go/packages-incompatible")
- }
- switch kind {
- case "GOPATH":
- exporter = packagestest.GOPATH
- case "GOPATH_GoPackages":
- exporter = packagestest.GOPATH
- forceGoPackages = true
- case "Modules":
- exporter = packagestest.Modules
- case "Modules_GoPackages":
- exporter = packagestest.Modules
- forceGoPackages = true
- default:
- panic("unknown test type")
- }
exported := packagestest.Export(t, exporter, c.modules)
defer exported.Cleanup()
@@ -1636,14 +1610,13 @@
it := &goimportTest{
T: t,
env: &ProcessEnv{
- GOROOT: env["GOROOT"],
- GOPATH: env["GOPATH"],
- GO111MODULE: env["GO111MODULE"],
- GOSUMDB: env["GOSUMDB"],
- WorkingDir: exported.Config.Dir,
- ForceGoPackages: forceGoPackages,
- Debug: *testDebug,
- Logf: log.Printf,
+ GOROOT: env["GOROOT"],
+ GOPATH: env["GOPATH"],
+ GO111MODULE: env["GO111MODULE"],
+ GOSUMDB: env["GOSUMDB"],
+ WorkingDir: exported.Config.Dir,
+ Debug: *testDebug,
+ Logf: log.Printf,
},
exported: exported,
}
@@ -2459,7 +2432,6 @@
var _ = &bytes.Buffer{}
`
testConfig{
- goPackagesIncompatible: true,
module: packagestest.Module{
Name: "mycompany.net",
},
@@ -2540,7 +2512,6 @@
Files: fm{"bar/bar.go": "package bar\n"},
},
},
- goPackagesIncompatible: true, // getAllCandidates doesn't support the go/packages resolver.
}.test(t, func(t *goimportTest) {
candidates, err := getAllCandidates("x.go", t.env)
if err != nil {
@@ -2577,7 +2548,6 @@
Files: fm{"rand/bar.go": "package rand\nvar Bar int\n"},
},
},
- goPackagesIncompatible: true, // getPackageCompletions doesn't support the go/packages resolver.
}.test(t, func(t *goimportTest) {
candidates, err := getPackageExports("rand", "x.go", t.env)
if err != nil {