|  | // Copyright 2022 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 checker_test | 
|  |  | 
|  | import ( | 
|  | "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" | 
|  | ) | 
|  |  | 
|  | // TestStartFixes make sure modifying the first character | 
|  | // of the file takes effect. | 
|  | func TestStartFixes(t *testing.T) { | 
|  | testenv.NeedsGoPackages(t) | 
|  |  | 
|  | files := map[string]string{ | 
|  | "comment/doc.go": `/* Package comment */ | 
|  | package comment | 
|  | `} | 
|  |  | 
|  | want := `// Package comment | 
|  | package comment | 
|  | ` | 
|  |  | 
|  | testdata, cleanup, err := analysistest.WriteFiles(files) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | path := filepath.Join(testdata, "src/comment/doc.go") | 
|  | checker.Fix = true | 
|  | checker.Run([]string{"file=" + path}, []*analysis.Analyzer{commentAnalyzer}) | 
|  |  | 
|  | 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 commentAnalyzer = &analysis.Analyzer{ | 
|  | Name:     "comment", | 
|  | Requires: []*analysis.Analyzer{inspect.Analyzer}, | 
|  | Run:      commentRun, | 
|  | } | 
|  |  | 
|  | func commentRun(pass *analysis.Pass) (interface{}, error) { | 
|  | const ( | 
|  | from = "/* Package comment */" | 
|  | to   = "// Package comment" | 
|  | ) | 
|  | inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) | 
|  | inspect.Preorder(nil, func(n ast.Node) { | 
|  | if n, ok := n.(*ast.Comment); ok && n.Text == from { | 
|  | pass.Report(analysis.Diagnostic{ | 
|  | Pos: n.Pos(), | 
|  | End: n.End(), | 
|  | SuggestedFixes: []analysis.SuggestedFix{{ | 
|  | TextEdits: []analysis.TextEdit{{ | 
|  | Pos:     n.Pos(), | 
|  | End:     n.End(), | 
|  | NewText: []byte(to), | 
|  | }}, | 
|  | }}, | 
|  | }) | 
|  | } | 
|  | }) | 
|  |  | 
|  | return nil, nil | 
|  | } |