From 82317cea8a3807ada2a9b6a794188f227b55595f Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Fri, 7 Feb 2025 12:38:02 -0500 Subject: [PATCH] gopls/internal/analysis/modernize: slices.Delete: import slices We forgot to add a call to AddImport: yet more evidence that our test framework needs to assert that fixes preserve well-typedness. RunWithSuggestedFix does a poor job of merging imports, so there are many duplicates in the golden file, but I will port the recent work in internal/checker to it. Change-Id: I976b52242772c2796b0cd54aab98d0710dbc2de9 Reviewed-on: https://go-review.googlesource.com/c/tools/+/647697 Auto-Submit: Alan Donovan LUCI-TryBot-Result: Go LUCI Reviewed-by: Jonathan Amsterdam --- .../internal/analysis/modernize/slicesdelete.go | 13 ++++++++----- .../src/slicesdelete/slicesdelete.go.golden | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/gopls/internal/analysis/modernize/slicesdelete.go b/gopls/internal/analysis/modernize/slicesdelete.go index f1f96c7d5fc..c9e2da0eb60 100644 --- a/gopls/internal/analysis/modernize/slicesdelete.go +++ b/gopls/internal/analysis/modernize/slicesdelete.go @@ -13,6 +13,7 @@ import ( "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" "golang.org/x/tools/go/ast/inspector" + "golang.org/x/tools/internal/analysisinternal" ) // The slicesdelete pass attempts to replace instances of append(s[:i], s[i+k:]...) @@ -22,7 +23,8 @@ import ( func slicesdelete(pass *analysis.Pass) { inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) info := pass.TypesInfo - report := func(call *ast.CallExpr, slice1, slice2 *ast.SliceExpr) { + report := func(file *ast.File, call *ast.CallExpr, slice1, slice2 *ast.SliceExpr) { + slicesName, edits := analysisinternal.AddImport(info, file, call.Pos(), "slices", "slices") pass.Report(analysis.Diagnostic{ Pos: call.Pos(), End: call.End(), @@ -30,12 +32,12 @@ func slicesdelete(pass *analysis.Pass) { Message: "Replace append with slices.Delete", SuggestedFixes: []analysis.SuggestedFix{{ Message: "Replace append with slices.Delete", - TextEdits: []analysis.TextEdit{ + TextEdits: append(edits, []analysis.TextEdit{ // Change name of called function. { Pos: call.Fun.Pos(), End: call.Fun.End(), - NewText: []byte("slices.Delete"), + NewText: []byte(slicesName + ".Delete"), }, // Delete ellipsis. { @@ -69,11 +71,12 @@ func slicesdelete(pass *analysis.Pass) { Pos: slice2.Low.End(), End: slice2.Rbrack + 1, }, - }, + }...), }}, }) } for curFile := range filesUsing(inspect, info, "go1.21") { + file := curFile.Node().(*ast.File) for curCall := range curFile.Preorder((*ast.CallExpr)(nil)) { call := curCall.Node().(*ast.CallExpr) if id, ok := call.Fun.(*ast.Ident); ok && len(call.Args) == 2 { @@ -88,7 +91,7 @@ func slicesdelete(pass *analysis.Pass) { equalSyntax(slice1.X, slice2.X) && increasingSliceIndices(info, slice1.High, slice2.Low) { // Have append(s[:a], s[b:]...) where we can verify a < b. - report(call, slice1, slice2) + report(file, call, slice1, slice2) } } } diff --git a/gopls/internal/analysis/modernize/testdata/src/slicesdelete/slicesdelete.go.golden b/gopls/internal/analysis/modernize/testdata/src/slicesdelete/slicesdelete.go.golden index 8c2f21a2782..9b2ba9a0b80 100644 --- a/gopls/internal/analysis/modernize/testdata/src/slicesdelete/slicesdelete.go.golden +++ b/gopls/internal/analysis/modernize/testdata/src/slicesdelete/slicesdelete.go.golden @@ -1,5 +1,21 @@ package slicesdelete +import "slices" + +import "slices" + +import "slices" + +import "slices" + +import "slices" + +import "slices" + +import "slices" + +import "slices" + var g struct{ f []int } func slicesdelete(test, other []byte, i int) {