...
Run Format

Source file src/cmd/fix/gotypes.go

Documentation: cmd/fix

  // Copyright 2015 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  package main
  
  import (
  	"go/ast"
  	"strconv"
  )
  
  func init() {
  	register(gotypesFix)
  }
  
  var gotypesFix = fix{
  	name: "gotypes",
  	date: "2015-07-16",
  	f:    gotypes,
  	desc: `Change imports of golang.org/x/tools/go/{exact,types} to go/{constant,types}`,
  }
  
  func gotypes(f *ast.File) bool {
  	truth := fixGoTypes(f)
  	if fixGoExact(f) {
  		truth = true
  	}
  	return truth
  }
  
  func fixGoTypes(f *ast.File) bool {
  	return rewriteImport(f, "golang.org/x/tools/go/types", "go/types")
  }
  
  func fixGoExact(f *ast.File) bool {
  	// This one is harder because the import name changes.
  	// First find the import spec.
  	var importSpec *ast.ImportSpec
  	walk(f, func(n interface{}) {
  		if importSpec != nil {
  			return
  		}
  		spec, ok := n.(*ast.ImportSpec)
  		if !ok {
  			return
  		}
  		path, err := strconv.Unquote(spec.Path.Value)
  		if err != nil {
  			return
  		}
  		if path == "golang.org/x/tools/go/exact" {
  			importSpec = spec
  		}
  
  	})
  	if importSpec == nil {
  		return false
  	}
  
  	// We are about to rename exact.* to constant.*, but constant is a common
  	// name. See if it will conflict. This is a hack but it is effective.
  	exists := renameTop(f, "constant", "constant")
  	suffix := ""
  	if exists {
  		suffix = "_"
  	}
  	// Now we need to rename all the uses of the import. RewriteImport
  	// affects renameTop, but not vice versa, so do them in this order.
  	renameTop(f, "exact", "constant"+suffix)
  	rewriteImport(f, "golang.org/x/tools/go/exact", "go/constant")
  	// renameTop will also rewrite the imported package name. Fix that;
  	// we know it should be missing.
  	importSpec.Name = nil
  	return true
  }
  

View as plain text