From 22be0841ca20ad8f900b2d3056ba48db2d8e05e9 Mon Sep 17 00:00:00 2001 From: "Iskander (Alex) Sharipov" Date: Mon, 3 Jan 2022 14:41:06 +0300 Subject: [PATCH] ruleguard: fix empty gogrep node slice interpolation (#345) --- analyzer/testdata/src/gocritic/deferUnlambda.go | 17 +++++++++++++++++ analyzer/testdata/src/gocritic/rules.go | 11 +++++++++++ ruleguard/runner.go | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 analyzer/testdata/src/gocritic/deferUnlambda.go diff --git a/analyzer/testdata/src/gocritic/deferUnlambda.go b/analyzer/testdata/src/gocritic/deferUnlambda.go new file mode 100644 index 00000000..b75c183a --- /dev/null +++ b/analyzer/testdata/src/gocritic/deferUnlambda.go @@ -0,0 +1,17 @@ +package gocritic + +import "fmt" + +func f(...interface{}) int { return 1 } + +const ten = 10 + +func positiveTests() { + defer func() { f() }() // want `\Qdefer f()` + + defer func() { f(1) }() // want `\Qdefer f(1)` + + defer func() { f(ten, ten+1) }() // want `\Qdefer f(ten, ten+1)` + + defer func() { fmt.Println("hello") }() // want `\Qdefer fmt.Println("hello")` +} diff --git a/analyzer/testdata/src/gocritic/rules.go b/analyzer/testdata/src/gocritic/rules.go index 12919f2c..0d230e89 100644 --- a/analyzer/testdata/src/gocritic/rules.go +++ b/analyzer/testdata/src/gocritic/rules.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package gorules @@ -264,3 +265,13 @@ func equalFold(m dsl.Matcher) { Suggest(`bytes.EqualFold($x, $y)]`). Report(`consider replacing with bytes.EqualFold($x, $y)`) } + +func deferUnlambda(m dsl.Matcher) { + m.Match(`defer func() { $f($*args) }()`). + Where(m["f"].Node.Is(`Ident`) && m["f"].Text != "panic" && m["f"].Text != "recover" && m["args"].Const). + Report("can rewrite as `defer $f($args)`") + + m.Match(`defer func() { $pkg.$f($*args) }()`). + Where(m["f"].Node.Is(`Ident`) && m["args"].Const && m["pkg"].Object.Is(`PkgName`)). + Report("can rewrite as `defer $pkg.$f($args)`") +} diff --git a/ruleguard/runner.go b/ruleguard/runner.go index efaf1d43..9adeb2b0 100644 --- a/ruleguard/runner.go +++ b/ruleguard/runner.go @@ -392,7 +392,7 @@ func (rr *rulesRunner) renderMessage(msg string, m matchData, truncate bool) str // For example, pattern `func $_() $results { $*_ }` may // match a nil *ast.FieldList for $results if executed // against a function with no results. - if reflect.ValueOf(n).IsNil() { + if reflect.ValueOf(n).IsNil() && !gogrep.IsEmptyNodeSlice(n) { continue } key := "$" + c.Name