From 6b086be8e3184c68764c5a320b064cca01ffc5fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Sun, 20 Aug 2023 19:03:02 +0300 Subject: [PATCH] Suggest strings.ContainsFunc instead of strings.IndexFunc with Go 1.21+ --- simple/lint.go | 10 +++++++++- simple/lint_test.go | 6 +++++- .../example.com/CheckStringsContains_go120/contains.go | 9 +++++++++ .../example.com/CheckStringsContains_go121/contains.go | 9 +++++++++ .../CheckStringsContains_go121/contains.go.golden | 9 +++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 simple/testdata/src/example.com/CheckStringsContains_go120/contains.go create mode 100644 simple/testdata/src/example.com/CheckStringsContains_go121/contains.go create mode 100644 simple/testdata/src/example.com/CheckStringsContains_go121/contains.go.golden diff --git a/simple/lint.go b/simple/lint.go index 433caa172..c99031533 100644 --- a/simple/lint.go +++ b/simple/lint.go @@ -349,6 +349,7 @@ func CheckStringsContains(pass *analysis.Pass) (interface{}, error) { return } + opts := []report.Option{} var r ast.Expr switch funIdent.Name { case "IndexRune": @@ -366,6 +367,12 @@ func CheckStringsContains(pass *analysis.Pass) (interface{}, error) { X: pkgIdent, Sel: &ast.Ident{Name: "Contains"}, } + case "IndexFunc": + r = &ast.SelectorExpr{ + X: pkgIdent, + Sel: &ast.Ident{Name: "ContainsFunc"}, + } + opts = append(opts, report.MinimumStdlibVersion(21)) default: return } @@ -381,9 +388,10 @@ func CheckStringsContains(pass *analysis.Pass) (interface{}, error) { } } - report.Report(pass, node, fmt.Sprintf("should use %s instead", report.Render(pass, r)), + opts = append(opts, report.FilterGenerated(), report.Fixes(edit.Fix(fmt.Sprintf("simplify use of %s", report.Render(pass, call.Fun)), edit.ReplaceWithNode(pass.Fset, node, r)))) + report.Report(pass, node, fmt.Sprintf("should use %s instead", report.Render(pass, r)), opts...) } code.Preorder(pass, fn, (*ast.BinaryExpr)(nil)) return nil, nil diff --git a/simple/lint_test.go b/simple/lint_test.go index 2d3f98baa..d9acc2598 100644 --- a/simple/lint_test.go +++ b/simple/lint_test.go @@ -11,7 +11,11 @@ func TestAll(t *testing.T) { "S1000": {{Dir: "example.com/CheckSingleCaseSelect"}}, "S1001": {{Dir: "example.com/CheckLoopCopy"}}, "S1002": {{Dir: "example.com/CheckIfBoolCmp"}}, - "S1003": {{Dir: "example.com/CheckStringsContains"}}, + "S1003": { + {Dir: "example.com/CheckStringsContains"}, + {Dir: "example.com/CheckStringsContains_go120", Version: "1.20"}, + {Dir: "example.com/CheckStringsContains_go121", Version: "1.21"}, + }, "S1004": {{Dir: "example.com/CheckBytesCompare"}}, "S1005": { {Dir: "example.com/CheckUnnecessaryBlank"}, diff --git a/simple/testdata/src/example.com/CheckStringsContains_go120/contains.go b/simple/testdata/src/example.com/CheckStringsContains_go120/contains.go new file mode 100644 index 000000000..8d5789dc3 --- /dev/null +++ b/simple/testdata/src/example.com/CheckStringsContains_go120/contains.go @@ -0,0 +1,9 @@ +package pkg + +import ( + "strings" +) + +func fn() { + _ = strings.IndexFunc("", func(r rune) bool { return false }) != -1 +} diff --git a/simple/testdata/src/example.com/CheckStringsContains_go121/contains.go b/simple/testdata/src/example.com/CheckStringsContains_go121/contains.go new file mode 100644 index 000000000..ebedc9c71 --- /dev/null +++ b/simple/testdata/src/example.com/CheckStringsContains_go121/contains.go @@ -0,0 +1,9 @@ +package pkg + +import ( + "strings" +) + +func fn() { + _ = strings.IndexFunc("", func(r rune) bool { return false }) != -1 //@ diag(`strings.ContainsFunc`) +} diff --git a/simple/testdata/src/example.com/CheckStringsContains_go121/contains.go.golden b/simple/testdata/src/example.com/CheckStringsContains_go121/contains.go.golden new file mode 100644 index 000000000..8f7da2d98 --- /dev/null +++ b/simple/testdata/src/example.com/CheckStringsContains_go121/contains.go.golden @@ -0,0 +1,9 @@ +package pkg + +import ( + "strings" +) + +func fn() { + _ = strings.ContainsFunc("", func(r rune) bool { return false }) //@ diag(`strings.ContainsFunc`) +}