--- /dev/null
+package checker_test
+
+import (
+ "fmt"
+ "go/ast"
+ "io/ioutil"
+ "path/filepath"
+ "testing"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/analysistest"
+ "golang.org/x/tools/go/analysis/internal/checker"
+ "golang.org/x/tools/go/analysis/passes/inspect"
+ "golang.org/x/tools/go/ast/inspector"
+ "golang.org/x/tools/internal/testenv"
+)
+
+var from, to string
+
+func TestApplyFixes(t *testing.T) {
+ testenv.NeedsGoPackages(t)
+
+ from = "bar"
+ to = "baz"
+
+ files := map[string]string{
+ "rename/test.go": `package rename
+
+func Foo() {
+ bar := 12
+ _ = bar
+}
+
+// the end
+`}
+ want := `package rename
+
+func Foo() {
+ baz := 12
+ _ = baz
+}
+
+// the end
+`
+
+ testdata, cleanup, err := analysistest.WriteFiles(files)
+ if err != nil {
+ t.Fatal(err)
+ }
+ path := filepath.Join(testdata, "src/rename/test.go")
+ checker.Fix = true
+ checker.Run([]string{"file=" + path}, []*analysis.Analyzer{analyzer})
+
+ contents, err := ioutil.ReadFile(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ got := string(contents)
+ if got != want {
+ t.Errorf("contents of rewritten file\ngot: %s\nwant: %s", got, want)
+ }
+
+ defer cleanup()
+}
+
+var analyzer = &analysis.Analyzer{
+ Name: "rename",
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ Run: run,
+}
+
+func run(pass *analysis.Pass) (interface{}, error) {
+ inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ nodeFilter := []ast.Node{(*ast.Ident)(nil)}
+ inspect.Preorder(nodeFilter, func(n ast.Node) {
+ ident := n.(*ast.Ident)
+ if ident.Name == from {
+ msg := fmt.Sprintf("renaming %q to %q", from, to)
+ pass.Report(analysis.Diagnostic{
+ Pos: ident.Pos(),
+ End: ident.End(),
+ Message: msg,
+ SuggestedFixes: []analysis.SuggestedFix{{
+ Message: msg,
+ TextEdits: []analysis.TextEdit{{
+ Pos: ident.Pos(),
+ End: ident.End(),
+ NewText: []byte(to),
+ }},
+ }},
+ })
+ }
+ })
+
+ return nil, nil
+}