diff --git a/cmd/vet/copylock.go b/cmd/vet/copylock.go index 95cecc799c..e8a6820fce 100644 --- a/cmd/vet/copylock.go +++ b/cmd/vet/copylock.go @@ -11,7 +11,8 @@ import ( "fmt" "go/ast" "go/token" - "go/types" + + "golang.org/x/tools/go/types" ) func init() { diff --git a/cmd/vet/main.go b/cmd/vet/main.go index abc39fcf0e..16b8842cdc 100644 --- a/cmd/vet/main.go +++ b/cmd/vet/main.go @@ -15,12 +15,14 @@ import ( "go/parser" "go/printer" "go/token" - "go/types" "io/ioutil" "os" "path/filepath" "strconv" "strings" + + _ "golang.org/x/tools/go/gcimporter" + "golang.org/x/tools/go/types" ) // TODO: Need a flag to set build tags when parsing the package. diff --git a/cmd/vet/nilfunc.go b/cmd/vet/nilfunc.go index bfe05e3353..fa1bac7e64 100644 --- a/cmd/vet/nilfunc.go +++ b/cmd/vet/nilfunc.go @@ -12,7 +12,8 @@ package main import ( "go/ast" "go/token" - "go/types" + + "golang.org/x/tools/go/types" ) func init() { diff --git a/cmd/vet/print.go b/cmd/vet/print.go index 58b4fae62c..b20d935ef4 100644 --- a/cmd/vet/print.go +++ b/cmd/vet/print.go @@ -10,12 +10,13 @@ import ( "bytes" "flag" "go/ast" - "go/exact" "go/token" - "go/types" "strconv" "strings" "unicode/utf8" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" ) var printfuncs = flag.String("printfuncs", "", "comma-separated list of print function names to check") diff --git a/cmd/vet/shadow.go b/cmd/vet/shadow.go index b3f362a080..34e5db9091 100644 --- a/cmd/vet/shadow.go +++ b/cmd/vet/shadow.go @@ -34,7 +34,8 @@ import ( "flag" "go/ast" "go/token" - "go/types" + + "golang.org/x/tools/go/types" ) var strictShadowing = flag.Bool("shadowstrict", false, "whether to be strict about shadowing; can be noisy") diff --git a/cmd/vet/shift.go b/cmd/vet/shift.go index 7898d28172..2385c23fdb 100644 --- a/cmd/vet/shift.go +++ b/cmd/vet/shift.go @@ -10,9 +10,10 @@ package main import ( "go/ast" - "go/exact" "go/token" - "go/types" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" ) func init() { diff --git a/cmd/vet/types.go b/cmd/vet/types.go index 57d1b5fd6d..89e9989d9a 100644 --- a/cmd/vet/types.go +++ b/cmd/vet/types.go @@ -8,14 +8,14 @@ package main import ( "go/ast" - "go/importer" "go/token" - "go/types" + + "golang.org/x/tools/go/types" ) -// The stdImporter implements importing from package files created by -// the compiler that built this binary. -var stdImporter = importer.Default() +// imports is the canonical map of imported packages we need for typechecking. +// It is created during initialization. +var imports = make(map[string]*types.Package) var ( stringerMethodType = types.New("func() string") @@ -35,7 +35,7 @@ func init() { // path.name, and adds the respective package to the imports map // as a side effect. func importType(path, name string) types.Type { - pkg, err := stdImporter.Import(path) + pkg, err := types.DefaultImport(imports, path) if err != nil { // This can happen if fmt hasn't been compiled yet. // Since nothing uses formatterType anyway, don't complain. @@ -56,12 +56,12 @@ func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File) error { pkg.spans = make(map[types.Object]Span) pkg.types = make(map[ast.Expr]types.TypeAndValue) config := types.Config{ + // We provide the same packages map for all imports to ensure + // that everybody sees identical packages for the given paths. + Packages: imports, // By providing a Config with our own error function, it will continue // past the first error. There is no need for that function to do anything. Error: func(error) {}, - // We use the same importer for all imports to ensure - // that everybody sees identical packages for the given paths. - Importer: stdImporter, } info := &types.Info{ Selections: pkg.selectors, diff --git a/cmd/vet/unsafeptr.go b/cmd/vet/unsafeptr.go index 9ca27dce0e..ca15f72578 100644 --- a/cmd/vet/unsafeptr.go +++ b/cmd/vet/unsafeptr.go @@ -9,7 +9,8 @@ package main import ( "go/ast" "go/token" - "go/types" + + "golang.org/x/tools/go/types" ) func init() { diff --git a/cmd/vet/unused.go b/cmd/vet/unused.go index 4287638586..cbec9bb8ab 100644 --- a/cmd/vet/unused.go +++ b/cmd/vet/unused.go @@ -11,8 +11,10 @@ import ( "flag" "go/ast" "go/token" - "go/types" "strings" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/types" ) var unusedFuncsFlag = flag.String("unusedfuncs", @@ -54,11 +56,11 @@ func initUnusedFlags() { } func checkUnusedResult(f *File, n ast.Node) { - call, ok := unparen(n.(*ast.ExprStmt).X).(*ast.CallExpr) + call, ok := astutil.Unparen(n.(*ast.ExprStmt).X).(*ast.CallExpr) if !ok { return // not a call statement } - fun := unparen(call.Fun) + fun := astutil.Unparen(call.Fun) if f.pkg.types[fun].IsType() { return // a conversion, not a call