Skip to content

Commit 608acff

Browse files
adonovangopherbot
authored andcommitted
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 <[email protected]> Reviewed-by: Robert Griesemer <[email protected]> Auto-Submit: Alan Donovan <[email protected]>
1 parent 9d21ef3 commit 608acff

10 files changed

+36
-27
lines changed

src/go/types/api_test.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@ import (
1919
"testing"
2020

2121
. "go/types"
22+
"runtime"
2223
)
2324

2425
// nopos indicates an unknown position
2526
var nopos token.Pos
2627

28+
func defaultImporter(fset *token.FileSet) Importer {
29+
return importer.ForCompiler(fset, runtime.Compiler, nil)
30+
}
31+
2732
func mustParse(fset *token.FileSet, src string) *ast.File {
2833
f, err := parser.ParseFile(fset, pkgName(src), src, parser.ParseComments)
2934
if err != nil {
@@ -33,12 +38,13 @@ func mustParse(fset *token.FileSet, src string) *ast.File {
3338
}
3439

3540
func typecheck(src string, conf *Config, info *Info) (*Package, error) {
41+
// TODO(adonovan): plumb this from caller.
3642
fset := token.NewFileSet()
3743
f := mustParse(fset, src)
3844
if conf == nil {
3945
conf = &Config{
4046
Error: func(err error) {}, // collect all errors
41-
Importer: importer.Default(),
47+
Importer: defaultImporter(fset),
4248
}
4349
}
4450
return conf.Check(f.Name.Name, fset, []*ast.File{f}, info)
@@ -1128,7 +1134,7 @@ var (
11281134
Implicits: make(map[ast.Node]Object),
11291135
}
11301136
var conf Config
1131-
conf.Importer = importer.Default()
1137+
conf.Importer = defaultImporter(fset)
11321138
_, err := conf.Check("p", fset, []*ast.File{f}, &info)
11331139
if err != nil {
11341140
t.Fatal(err)

src/go/types/check_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"flag"
3535
"fmt"
3636
"go/ast"
37-
"go/importer"
3837
"go/parser"
3938
"go/scanner"
4039
"go/token"
@@ -164,7 +163,7 @@ func testFilesImpl(t *testing.T, filenames []string, srcs [][]byte, manual bool,
164163
// set up typechecker
165164
var conf Config
166165
*boolFieldAddr(&conf, "_Trace") = manual && testing.Verbose()
167-
conf.Importer = importer.Default()
166+
conf.Importer = defaultImporter(fset)
168167
conf.Error = func(err error) {
169168
if *haltOnError {
170169
defer panic(err)

src/go/types/eval_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package types_test
99
import (
1010
"fmt"
1111
"go/ast"
12-
"go/importer"
1312
"go/parser"
1413
"go/token"
1514
"go/types"
@@ -188,7 +187,7 @@ func TestEvalPos(t *testing.T) {
188187
files = append(files, file)
189188
}
190189

191-
conf := Config{Importer: importer.Default()}
190+
conf := Config{Importer: defaultImporter(fset)}
192191
pkg, err := conf.Check("p", fset, files, nil)
193192
if err != nil {
194193
t.Fatal(err)
@@ -257,7 +256,7 @@ func f(a int, s string) S {
257256
t.Fatal(err)
258257
}
259258

260-
conf := Config{Importer: importer.Default()}
259+
conf := Config{Importer: defaultImporter(fset)}
261260
pkg, err := conf.Check("p", fset, []*ast.File{f}, nil)
262261
if err != nil {
263262
t.Fatal(err)

src/go/types/example_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"fmt"
2020
"go/ast"
2121
"go/format"
22-
"go/importer"
2322
"go/parser"
2423
"go/token"
2524
"go/types"
@@ -57,7 +56,7 @@ func Unused() { {}; {{ var x int; _ = x }} } // make sure empty block scopes get
5756
// Type-check a package consisting of these files.
5857
// Type information for the imported "fmt" package
5958
// comes from $GOROOT/pkg/$GOOS_$GOOARCH/fmt.a.
60-
conf := types.Config{Importer: importer.Default()}
59+
conf := types.Config{Importer: defaultImporter(fset)}
6160
pkg, err := conf.Check("temperature", fset, files, nil)
6261
if err != nil {
6362
log.Fatal(err)
@@ -126,7 +125,7 @@ type I interface { m() byte }
126125
// Type-check a package consisting of this file.
127126
// Type information for the imported packages
128127
// comes from $GOROOT/pkg/$GOOS_$GOOARCH/fmt.a.
129-
conf := types.Config{Importer: importer.Default()}
128+
conf := types.Config{Importer: defaultImporter(fset)}
130129
pkg, err := conf.Check("temperature", fset, []*ast.File{f}, nil)
131130
if err != nil {
132131
log.Fatal(err)

src/go/types/issues_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package types_test
99
import (
1010
"fmt"
1111
"go/ast"
12-
"go/importer"
1312
"go/parser"
1413
"go/token"
1514
"internal/testenv"
@@ -291,7 +290,7 @@ func TestIssue25627(t *testing.T) {
291290
} {
292291
f := mustParse(fset, prefix+src)
293292

294-
cfg := Config{Importer: importer.Default(), Error: func(err error) {}}
293+
cfg := Config{Importer: defaultImporter(fset), Error: func(err error) {}}
295294
info := &Info{Types: make(map[ast.Expr]TypeAndValue)}
296295
_, err := cfg.Check(f.Name.Name, fset, []*ast.File{f}, info)
297296
if err != nil {
@@ -595,7 +594,11 @@ var _ T = template /* ERRORx "cannot use.*text/template.* as T value" */.Templat
595594
)
596595

597596
a := mustTypecheck(asrc, nil, nil)
598-
imp := importHelper{pkg: a, fallback: importer.Default()}
597+
imp := importHelper{
598+
pkg: a,
599+
// TODO(adonovan): use same FileSet as mustTypecheck.
600+
fallback: defaultImporter(token.NewFileSet()),
601+
}
599602

600603
withImporter := func(cfg *Config) {
601604
cfg.Importer = imp

src/go/types/lookup_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package types_test
66

77
import (
8-
"go/importer"
98
"go/token"
109
"path/filepath"
1110
"runtime"
@@ -28,7 +27,7 @@ func BenchmarkLookupFieldOrMethod(b *testing.B) {
2827
}
2928

3029
conf := Config{
31-
Importer: importer.Default(),
30+
Importer: defaultImporter(fset),
3231
}
3332

3433
pkg, err := conf.Check("http", fset, files, nil)

src/go/types/mono_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package types_test
77
import (
88
"errors"
99
"fmt"
10-
"go/importer"
1110
"go/types"
1211
"strings"
1312
"testing"
@@ -19,7 +18,7 @@ func checkMono(t *testing.T, body string) error {
1918
var buf strings.Builder
2019
conf := types.Config{
2120
Error: func(err error) { fmt.Fprintln(&buf, err) },
22-
Importer: importer.Default(),
21+
Importer: defaultImporter(fset), // TODO(adonovan): use same FileSet as typecheck
2322
}
2423
typecheck(src, &conf, nil)
2524
if buf.Len() == 0 {

src/go/types/resolver_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package types_test
77
import (
88
"fmt"
99
"go/ast"
10-
"go/importer"
1110
"go/token"
1211
"internal/testenv"
1312
"slices"
@@ -17,6 +16,7 @@ import (
1716
)
1817

1918
type resolveTestImporter struct {
19+
fset *token.FileSet
2020
importer ImporterFrom
2121
imported map[string]bool
2222
}
@@ -30,7 +30,7 @@ func (imp *resolveTestImporter) ImportFrom(path, srcDir string, mode ImportMode)
3030
panic("mode must be 0")
3131
}
3232
if imp.importer == nil {
33-
imp.importer = importer.Default().(ImporterFrom)
33+
imp.importer = defaultImporter(fset).(ImporterFrom)
3434
imp.imported = make(map[string]bool)
3535
}
3636
pkg, err := imp.importer.ImportFrom(path, srcDir, mode)
@@ -124,7 +124,7 @@ func TestResolveIdents(t *testing.T) {
124124
}
125125

126126
// resolve and type-check package AST
127-
importer := new(resolveTestImporter)
127+
importer := &resolveTestImporter{fset: fset}
128128
conf := Config{Importer: importer}
129129
uses := make(map[*ast.Ident]Object)
130130
defs := make(map[*ast.Ident]Object)

src/go/types/self_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package types_test
66

77
import (
88
"go/ast"
9-
"go/importer"
109
"go/parser"
1110
"go/token"
1211
"internal/testenv"
@@ -27,7 +26,7 @@ func TestSelf(t *testing.T) {
2726
t.Fatal(err)
2827
}
2928

30-
conf := Config{Importer: importer.Default()}
29+
conf := Config{Importer: defaultImporter(fset)}
3130
_, err = conf.Check("go/types", fset, files, nil)
3231
if err != nil {
3332
t.Fatal(err)
@@ -82,7 +81,7 @@ func runbench(b *testing.B, path string, ignoreFuncBodies, writeInfo bool) {
8281
for i := 0; i < b.N; i++ {
8382
conf := Config{
8483
IgnoreFuncBodies: ignoreFuncBodies,
85-
Importer: importer.Default(),
84+
Importer: defaultImporter(fset),
8685
}
8786
var info *Info
8887
if writeInfo {

src/go/types/sizes_test.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ package types_test
88

99
import (
1010
"go/ast"
11-
"go/importer"
11+
"go/token"
1212
"go/types"
1313
"internal/testenv"
1414
"testing"
@@ -87,7 +87,8 @@ const _ = unsafe.Offsetof(struct{ x int64 }{}.x)
8787
`
8888
info := types.Info{Types: make(map[ast.Expr]types.TypeAndValue)}
8989
conf := types.Config{
90-
Importer: importer.Default(),
90+
// TODO(adonovan): use same FileSet as mustTypecheck.
91+
Importer: defaultImporter(token.NewFileSet()),
9192
Sizes: &types.StdSizes{WordSize: 8, MaxAlign: 8},
9293
}
9394
mustTypecheck(src, &conf, &info)
@@ -117,7 +118,8 @@ var s struct {
117118
for _, arch := range []string{"386", "amd64"} {
118119
t.Run(arch, func(t *testing.T) {
119120
conf := types.Config{
120-
Importer: importer.Default(),
121+
// TODO(adonovan): use same FileSet as findStructTypeConfig.
122+
Importer: defaultImporter(token.NewFileSet()),
121123
Sizes: types.SizesFor("gc", arch),
122124
}
123125
ts := findStructTypeConfig(t, src, &conf)
@@ -188,7 +190,11 @@ func TestGCSizes(t *testing.T) {
188190
tc := tc
189191
t.Run(tc.name, func(t *testing.T) {
190192
t.Parallel()
191-
conf := types.Config{Importer: importer.Default(), Sizes: types.SizesFor("gc", "amd64")}
193+
conf := types.Config{
194+
// TODO(adonovan): use same FileSet as mustTypecheck.
195+
Importer: defaultImporter(token.NewFileSet()),
196+
Sizes: types.SizesFor("gc", "amd64"),
197+
}
192198
mustTypecheck(tc.src, &conf, nil)
193199
})
194200
}

0 commit comments

Comments
 (0)