go/types: avoid importer.Default
It uses a throwaway FileSet, so all position info is
wrong, and potentially misleading.
(Various other helpers in go/types testing also use a
throwaway FileSet, and should really accept it as a parameter.)
Fixes #71272
Change-Id: I9d899b987837b4041a299aad5ec266cb4f5d125c
Reviewed-on: https://go-review.googlesource.com/c/go/+/643777
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Auto-Submit: Alan Donovan <adonovan@google.com>
diff --git a/src/go/types/api_test.go b/src/go/types/api_test.go
index b686578..27b4ab8 100644
--- a/src/go/types/api_test.go
+++ b/src/go/types/api_test.go
@@ -19,11 +19,16 @@
"testing"
. "go/types"
+ "runtime"
)
// nopos indicates an unknown position
var nopos token.Pos
+func defaultImporter(fset *token.FileSet) Importer {
+ return importer.ForCompiler(fset, runtime.Compiler, nil)
+}
+
func mustParse(fset *token.FileSet, src string) *ast.File {
f, err := parser.ParseFile(fset, pkgName(src), src, parser.ParseComments)
if err != nil {
@@ -33,12 +38,13 @@
}
func typecheck(src string, conf *Config, info *Info) (*Package, error) {
+ // TODO(adonovan): plumb this from caller.
fset := token.NewFileSet()
f := mustParse(fset, src)
if conf == nil {
conf = &Config{
Error: func(err error) {}, // collect all errors
- Importer: importer.Default(),
+ Importer: defaultImporter(fset),
}
}
return conf.Check(f.Name.Name, fset, []*ast.File{f}, info)
@@ -1128,7 +1134,7 @@
Implicits: make(map[ast.Node]Object),
}
var conf Config
- conf.Importer = importer.Default()
+ conf.Importer = defaultImporter(fset)
_, err := conf.Check("p", fset, []*ast.File{f}, &info)
if err != nil {
t.Fatal(err)
diff --git a/src/go/types/check_test.go b/src/go/types/check_test.go
index a10d014..8235258 100644
--- a/src/go/types/check_test.go
+++ b/src/go/types/check_test.go
@@ -34,7 +34,6 @@
"flag"
"fmt"
"go/ast"
- "go/importer"
"go/parser"
"go/scanner"
"go/token"
@@ -164,7 +163,7 @@
// set up typechecker
var conf Config
*boolFieldAddr(&conf, "_Trace") = manual && testing.Verbose()
- conf.Importer = importer.Default()
+ conf.Importer = defaultImporter(fset)
conf.Error = func(err error) {
if *haltOnError {
defer panic(err)
diff --git a/src/go/types/eval_test.go b/src/go/types/eval_test.go
index b9afb91..49d901f 100644
--- a/src/go/types/eval_test.go
+++ b/src/go/types/eval_test.go
@@ -9,7 +9,6 @@
import (
"fmt"
"go/ast"
- "go/importer"
"go/parser"
"go/token"
"go/types"
@@ -188,7 +187,7 @@
files = append(files, file)
}
- conf := Config{Importer: importer.Default()}
+ conf := Config{Importer: defaultImporter(fset)}
pkg, err := conf.Check("p", fset, files, nil)
if err != nil {
t.Fatal(err)
@@ -257,7 +256,7 @@
t.Fatal(err)
}
- conf := Config{Importer: importer.Default()}
+ conf := Config{Importer: defaultImporter(fset)}
pkg, err := conf.Check("p", fset, []*ast.File{f}, nil)
if err != nil {
t.Fatal(err)
diff --git a/src/go/types/example_test.go b/src/go/types/example_test.go
index 2797711..d8e5de7 100644
--- a/src/go/types/example_test.go
+++ b/src/go/types/example_test.go
@@ -19,7 +19,6 @@
"fmt"
"go/ast"
"go/format"
- "go/importer"
"go/parser"
"go/token"
"go/types"
@@ -57,7 +56,7 @@
// Type-check a package consisting of these files.
// Type information for the imported "fmt" package
// comes from $GOROOT/pkg/$GOOS_$GOOARCH/fmt.a.
- conf := types.Config{Importer: importer.Default()}
+ conf := types.Config{Importer: defaultImporter(fset)}
pkg, err := conf.Check("temperature", fset, files, nil)
if err != nil {
log.Fatal(err)
@@ -126,7 +125,7 @@
// Type-check a package consisting of this file.
// Type information for the imported packages
// comes from $GOROOT/pkg/$GOOS_$GOOARCH/fmt.a.
- conf := types.Config{Importer: importer.Default()}
+ conf := types.Config{Importer: defaultImporter(fset)}
pkg, err := conf.Check("temperature", fset, []*ast.File{f}, nil)
if err != nil {
log.Fatal(err)
diff --git a/src/go/types/issues_test.go b/src/go/types/issues_test.go
index 3eb34cf..f2c63f16 100644
--- a/src/go/types/issues_test.go
+++ b/src/go/types/issues_test.go
@@ -9,7 +9,6 @@
import (
"fmt"
"go/ast"
- "go/importer"
"go/parser"
"go/token"
"internal/testenv"
@@ -291,7 +290,7 @@
} {
f := mustParse(fset, prefix+src)
- cfg := Config{Importer: importer.Default(), Error: func(err error) {}}
+ cfg := Config{Importer: defaultImporter(fset), Error: func(err error) {}}
info := &Info{Types: make(map[ast.Expr]TypeAndValue)}
_, err := cfg.Check(f.Name.Name, fset, []*ast.File{f}, info)
if err != nil {
@@ -595,7 +594,11 @@
)
a := mustTypecheck(asrc, nil, nil)
- imp := importHelper{pkg: a, fallback: importer.Default()}
+ imp := importHelper{
+ pkg: a,
+ // TODO(adonovan): use same FileSet as mustTypecheck.
+ fallback: defaultImporter(token.NewFileSet()),
+ }
withImporter := func(cfg *Config) {
cfg.Importer = imp
diff --git a/src/go/types/lookup_test.go b/src/go/types/lookup_test.go
index d3ca58b..e90a2ec 100644
--- a/src/go/types/lookup_test.go
+++ b/src/go/types/lookup_test.go
@@ -5,7 +5,6 @@
package types_test
import (
- "go/importer"
"go/token"
"path/filepath"
"runtime"
@@ -28,7 +27,7 @@
}
conf := Config{
- Importer: importer.Default(),
+ Importer: defaultImporter(fset),
}
pkg, err := conf.Check("http", fset, files, nil)
diff --git a/src/go/types/mono_test.go b/src/go/types/mono_test.go
index ccab846..d1f19ac 100644
--- a/src/go/types/mono_test.go
+++ b/src/go/types/mono_test.go
@@ -7,7 +7,6 @@
import (
"errors"
"fmt"
- "go/importer"
"go/types"
"strings"
"testing"
@@ -19,7 +18,7 @@
var buf strings.Builder
conf := types.Config{
Error: func(err error) { fmt.Fprintln(&buf, err) },
- Importer: importer.Default(),
+ Importer: defaultImporter(fset), // TODO(adonovan): use same FileSet as typecheck
}
typecheck(src, &conf, nil)
if buf.Len() == 0 {
diff --git a/src/go/types/resolver_test.go b/src/go/types/resolver_test.go
index a83f134..680ee69 100644
--- a/src/go/types/resolver_test.go
+++ b/src/go/types/resolver_test.go
@@ -7,7 +7,6 @@
import (
"fmt"
"go/ast"
- "go/importer"
"go/token"
"internal/testenv"
"slices"
@@ -17,6 +16,7 @@
)
type resolveTestImporter struct {
+ fset *token.FileSet
importer ImporterFrom
imported map[string]bool
}
@@ -30,7 +30,7 @@
panic("mode must be 0")
}
if imp.importer == nil {
- imp.importer = importer.Default().(ImporterFrom)
+ imp.importer = defaultImporter(fset).(ImporterFrom)
imp.imported = make(map[string]bool)
}
pkg, err := imp.importer.ImportFrom(path, srcDir, mode)
@@ -124,7 +124,7 @@
}
// resolve and type-check package AST
- importer := new(resolveTestImporter)
+ importer := &resolveTestImporter{fset: fset}
conf := Config{Importer: importer}
uses := make(map[*ast.Ident]Object)
defs := make(map[*ast.Ident]Object)
diff --git a/src/go/types/self_test.go b/src/go/types/self_test.go
index 27fa756..b4cc6286 100644
--- a/src/go/types/self_test.go
+++ b/src/go/types/self_test.go
@@ -6,7 +6,6 @@
import (
"go/ast"
- "go/importer"
"go/parser"
"go/token"
"internal/testenv"
@@ -27,7 +26,7 @@
t.Fatal(err)
}
- conf := Config{Importer: importer.Default()}
+ conf := Config{Importer: defaultImporter(fset)}
_, err = conf.Check("go/types", fset, files, nil)
if err != nil {
t.Fatal(err)
@@ -82,7 +81,7 @@
for i := 0; i < b.N; i++ {
conf := Config{
IgnoreFuncBodies: ignoreFuncBodies,
- Importer: importer.Default(),
+ Importer: defaultImporter(fset),
}
var info *Info
if writeInfo {
diff --git a/src/go/types/sizes_test.go b/src/go/types/sizes_test.go
index 825bc1f..157faf8 100644
--- a/src/go/types/sizes_test.go
+++ b/src/go/types/sizes_test.go
@@ -8,7 +8,7 @@
import (
"go/ast"
- "go/importer"
+ "go/token"
"go/types"
"internal/testenv"
"testing"
@@ -87,7 +87,8 @@
`
info := types.Info{Types: make(map[ast.Expr]types.TypeAndValue)}
conf := types.Config{
- Importer: importer.Default(),
+ // TODO(adonovan): use same FileSet as mustTypecheck.
+ Importer: defaultImporter(token.NewFileSet()),
Sizes: &types.StdSizes{WordSize: 8, MaxAlign: 8},
}
mustTypecheck(src, &conf, &info)
@@ -117,7 +118,8 @@
for _, arch := range []string{"386", "amd64"} {
t.Run(arch, func(t *testing.T) {
conf := types.Config{
- Importer: importer.Default(),
+ // TODO(adonovan): use same FileSet as findStructTypeConfig.
+ Importer: defaultImporter(token.NewFileSet()),
Sizes: types.SizesFor("gc", arch),
}
ts := findStructTypeConfig(t, src, &conf)
@@ -188,7 +190,11 @@
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
- conf := types.Config{Importer: importer.Default(), Sizes: types.SizesFor("gc", "amd64")}
+ conf := types.Config{
+ // TODO(adonovan): use same FileSet as mustTypecheck.
+ Importer: defaultImporter(token.NewFileSet()),
+ Sizes: types.SizesFor("gc", "amd64"),
+ }
mustTypecheck(tc.src, &conf, nil)
})
}