github.com/slayercat/go@v0.0.0-20170428012452-c51559813f61/src/cmd/fix/gotypes.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "go/ast" 9 "strconv" 10 ) 11 12 func init() { 13 register(gotypesFix) 14 } 15 16 var gotypesFix = fix{ 17 name: "gotypes", 18 date: "2015-07-16", 19 f: gotypes, 20 desc: `Change imports of golang.org/x/tools/go/{exact,types} to go/{constant,types}`, 21 } 22 23 func gotypes(f *ast.File) bool { 24 truth := fixGoTypes(f) 25 if fixGoExact(f) { 26 truth = true 27 } 28 return truth 29 } 30 31 func fixGoTypes(f *ast.File) bool { 32 return rewriteImport(f, "golang.org/x/tools/go/types", "go/types") 33 } 34 35 func fixGoExact(f *ast.File) bool { 36 // This one is harder because the import name changes. 37 // First find the import spec. 38 var importSpec *ast.ImportSpec 39 walk(f, func(n interface{}) { 40 if importSpec != nil { 41 return 42 } 43 spec, ok := n.(*ast.ImportSpec) 44 if !ok { 45 return 46 } 47 path, err := strconv.Unquote(spec.Path.Value) 48 if err != nil { 49 return 50 } 51 if path == "golang.org/x/tools/go/exact" { 52 importSpec = spec 53 } 54 55 }) 56 if importSpec == nil { 57 return false 58 } 59 60 // We are about to rename exact.* to constant.*, but constant is a common 61 // name. See if it will conflict. This is a hack but it is effective. 62 exists := renameTop(f, "constant", "constant") 63 suffix := "" 64 if exists { 65 suffix = "_" 66 } 67 // Now we need to rename all the uses of the import. RewriteImport 68 // affects renameTop, but not vice versa, so do them in this order. 69 renameTop(f, "exact", "constant"+suffix) 70 rewriteImport(f, "golang.org/x/tools/go/exact", "go/constant") 71 // renameTop will also rewrite the imported package name. Fix that; 72 // we know it should be missing. 73 importSpec.Name = nil 74 return true 75 }