]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: avoid importer.Default
authorAlan Donovan <adonovan@google.com>
Wed, 22 Jan 2025 15:43:44 +0000 (10:43 -0500)
committerGopher Robot <gobot@golang.org>
Wed, 22 Jan 2025 18:13:04 +0000 (10:13 -0800)
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>

src/go/types/api_test.go
src/go/types/check_test.go
src/go/types/eval_test.go
src/go/types/example_test.go
src/go/types/issues_test.go
src/go/types/lookup_test.go
src/go/types/mono_test.go
src/go/types/resolver_test.go
src/go/types/self_test.go
src/go/types/sizes_test.go

index b686578b38278aba48bb4dc391d963c2359bd0b6..27b4ab8ea0041306de7e81dd4cc799d4cee8d554 100644 (file)
@@ -19,11 +19,16 @@ import (
        "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 mustParse(fset *token.FileSet, src string) *ast.File {
 }
 
 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 @@ var (
                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)
index a10d0147da2c6516e6ee3c4f0444f343f97c9105..823525828ae3e45ac7a831b4ead9361623b290b6 100644 (file)
@@ -34,7 +34,6 @@ import (
        "flag"
        "fmt"
        "go/ast"
-       "go/importer"
        "go/parser"
        "go/scanner"
        "go/token"
@@ -164,7 +163,7 @@ func testFilesImpl(t *testing.T, filenames []string, srcs [][]byte, manual bool,
        // 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)
index b9afb9117f80c1fe93d9c8b90bb81ff05bd2beed..49d901f6924b69e81e4d071536904c195c5170bf 100644 (file)
@@ -9,7 +9,6 @@ package types_test
 import (
        "fmt"
        "go/ast"
-       "go/importer"
        "go/parser"
        "go/token"
        "go/types"
@@ -188,7 +187,7 @@ func TestEvalPos(t *testing.T) {
                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 @@ func f(a int, s string) S {
                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)
index 279771121aaaaeace78aed772de77fb0ed0ce4df..d8e5de7476c81bc7e21b659e6bc6610239509c42 100644 (file)
@@ -19,7 +19,6 @@ import (
        "fmt"
        "go/ast"
        "go/format"
-       "go/importer"
        "go/parser"
        "go/token"
        "go/types"
@@ -57,7 +56,7 @@ func Unused() { {}; {{ var x int; _ = x }} } // make sure empty block scopes get
        // 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 I interface { m() byte }
        // 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)
index 3eb34cf2d0dee520350d72b2911ec9a7e9a76f21..f2c63f16f9aba6bfedc7dc1c96bbdaebc40041ed 100644 (file)
@@ -9,7 +9,6 @@ package types_test
 import (
        "fmt"
        "go/ast"
-       "go/importer"
        "go/parser"
        "go/token"
        "internal/testenv"
@@ -291,7 +290,7 @@ func TestIssue25627(t *testing.T) {
        } {
                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 @@ var _ T = template /* ERRORx "cannot use.*text/template.* as T value" */.Templat
        )
 
        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
index d3ca58b9fa16f217d3f489e78c3b3aa2b0414438..e90a2ec89a32dbc57b2bc83c37c9d486c7552cc8 100644 (file)
@@ -5,7 +5,6 @@
 package types_test
 
 import (
-       "go/importer"
        "go/token"
        "path/filepath"
        "runtime"
@@ -28,7 +27,7 @@ func BenchmarkLookupFieldOrMethod(b *testing.B) {
        }
 
        conf := Config{
-               Importer: importer.Default(),
+               Importer: defaultImporter(fset),
        }
 
        pkg, err := conf.Check("http", fset, files, nil)
index ccab846c6dd6e343b846deaa8f6947c9faca03fe..d1f19ac5582fa1d6100861ee6c629f05f02393a1 100644 (file)
@@ -7,7 +7,6 @@ package types_test
 import (
        "errors"
        "fmt"
-       "go/importer"
        "go/types"
        "strings"
        "testing"
@@ -19,7 +18,7 @@ func checkMono(t *testing.T, body string) error {
        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 {
index a83f1344de91c03f848c6890b010f49f4c04fdff..680ee69c97f4cc2828e3d0691df40f043053e683 100644 (file)
@@ -7,7 +7,6 @@ package types_test
 import (
        "fmt"
        "go/ast"
-       "go/importer"
        "go/token"
        "internal/testenv"
        "slices"
@@ -17,6 +16,7 @@ import (
 )
 
 type resolveTestImporter struct {
+       fset     *token.FileSet
        importer ImporterFrom
        imported map[string]bool
 }
@@ -30,7 +30,7 @@ func (imp *resolveTestImporter) ImportFrom(path, srcDir string, mode ImportMode)
                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 @@ func TestResolveIdents(t *testing.T) {
        }
 
        // 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)
index 27fa75652a5204a3663a2eb89311a442416a1898..b4cc6286a18f8108676b7ac2e507f54d56c0fd60 100644 (file)
@@ -6,7 +6,6 @@ package types_test
 
 import (
        "go/ast"
-       "go/importer"
        "go/parser"
        "go/token"
        "internal/testenv"
@@ -27,7 +26,7 @@ func TestSelf(t *testing.T) {
                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 @@ func runbench(b *testing.B, path string, ignoreFuncBodies, writeInfo bool) {
        for i := 0; i < b.N; i++ {
                conf := Config{
                        IgnoreFuncBodies: ignoreFuncBodies,
-                       Importer:         importer.Default(),
+                       Importer:         defaultImporter(fset),
                }
                var info *Info
                if writeInfo {
index 825bc1f9f52ada9fd94f02bbdf9a2ad3b80debc1..157faf87d4c57504d89843aade55d677682b0641 100644 (file)
@@ -8,7 +8,7 @@ package types_test
 
 import (
        "go/ast"
-       "go/importer"
+       "go/token"
        "go/types"
        "internal/testenv"
        "testing"
@@ -87,7 +87,8 @@ const _ = unsafe.Offsetof(struct{ x int64 }{}.x)
 `
        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 @@ var s struct {
        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 @@ func TestGCSizes(t *testing.T) {
                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)
                })
        }