Home | History | Annotate | Download | only in fix
      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 }
     76