From 40399986c71b854be25a6c510190d4599afbe82f Mon Sep 17 00:00:00 2001 From: Iskander Sharipov Date: Sun, 28 Aug 2022 19:49:50 +0300 Subject: [PATCH] checkers: fix reflect.Value suggestion in redundantSprint Also enable embedded rules testing: we need to call InitEmbeddedRules() somewhere inside the testing code in order for them to be registered. Fixes #1255 --- checkers/checkers_test.go | 6 ++++ checkers/rules/rules.go | 2 +- checkers/rulesdata/rulesdata.go | 29 +++++++++++++++---- .../redundantSprint/negative_tests.go | 12 ++++++++ 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/checkers/checkers_test.go b/checkers/checkers_test.go index fa2ebb8d1..072d9fbf5 100644 --- a/checkers/checkers_test.go +++ b/checkers/checkers_test.go @@ -12,6 +12,12 @@ import ( "github.com/google/go-cmp/cmp" ) +func init() { + if err := InitEmbeddedRules(); err != nil { + panic(err) // Should never happen + } +} + func TestCheckers(t *testing.T) { allParams := map[string]map[string]interface{}{ "captLocal": {"paramsOnly": false}, diff --git a/checkers/rules/rules.go b/checkers/rules/rules.go index 8cffe61ec..9d138f768 100644 --- a/checkers/rules/rules.go +++ b/checkers/rules/rules.go @@ -10,7 +10,7 @@ import ( //doc:after x.String() func redundantSprint(m dsl.Matcher) { m.Match(`fmt.Sprint($x)`, `fmt.Sprintf("%s", $x)`, `fmt.Sprintf("%v", $x)`). - Where(m["x"].Type.Implements(`fmt.Stringer`)). + Where(!m["x"].Type.Is(`reflect.Value`) && m["x"].Type.Implements(`fmt.Stringer`)). Suggest(`$x.String()`). Report(`use $x.String() instead`) diff --git a/checkers/rulesdata/rulesdata.go b/checkers/rulesdata/rulesdata.go index fd63c9b14..581222b56 100644 --- a/checkers/rulesdata/rulesdata.go +++ b/checkers/rulesdata/rulesdata.go @@ -28,11 +28,30 @@ var PrecompiledRules = &ir.File{ ReportTemplate: "use $x.String() instead", SuggestTemplate: "$x.String()", WhereExpr: ir.FilterExpr{ - Line: 13, - Op: ir.FilterVarTypeImplementsOp, - Src: "m[\"x\"].Type.Implements(`fmt.Stringer`)", - Value: "x", - Args: []ir.FilterExpr{{Line: 13, Op: ir.FilterStringOp, Src: "`fmt.Stringer`", Value: "fmt.Stringer"}}, + Line: 13, + Op: ir.FilterAndOp, + Src: "!m[\"x\"].Type.Is(`reflect.Value`) && m[\"x\"].Type.Implements(`fmt.Stringer`)", + Args: []ir.FilterExpr{ + { + Line: 13, + Op: ir.FilterNotOp, + Src: "!m[\"x\"].Type.Is(`reflect.Value`)", + Args: []ir.FilterExpr{{ + Line: 13, + Op: ir.FilterVarTypeIsOp, + Src: "m[\"x\"].Type.Is(`reflect.Value`)", + Value: "x", + Args: []ir.FilterExpr{{Line: 13, Op: ir.FilterStringOp, Src: "`reflect.Value`", Value: "reflect.Value"}}, + }}, + }, + { + Line: 13, + Op: ir.FilterVarTypeImplementsOp, + Src: "m[\"x\"].Type.Implements(`fmt.Stringer`)", + Value: "x", + Args: []ir.FilterExpr{{Line: 13, Op: ir.FilterStringOp, Src: "`fmt.Stringer`", Value: "fmt.Stringer"}}, + }, + }, }, }, { diff --git a/checkers/testdata/redundantSprint/negative_tests.go b/checkers/testdata/redundantSprint/negative_tests.go index ef1a9b363..bff9a1638 100644 --- a/checkers/testdata/redundantSprint/negative_tests.go +++ b/checkers/testdata/redundantSprint/negative_tests.go @@ -1,5 +1,10 @@ package checker_test +import ( + "fmt" + "reflect" +) + func _() { { var foo withStringer @@ -17,4 +22,11 @@ func _() { _ = "x" } + + { + var rv reflect.Value + _ = fmt.Sprint(rv) + _ = fmt.Sprintf("%s", rv) + _ = fmt.Sprintf("%v", rv) + } }