From d200c33105dbd5ee12b97ac9a474b33c04131930 Mon Sep 17 00:00:00 2001 From: alwx Date: Sun, 20 Jul 2025 14:46:38 +0300 Subject: [PATCH] fix false positive case when error is not handling in condition fixes #5 --- noinlineerr.go | 24 ++++++++++++++++++++++-- testdata/src/a/main.go | 5 +++++ testdata/src/a/main.go.golden | 5 +++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/noinlineerr.go b/noinlineerr.go index ecafcd9..9bf5623 100644 --- a/noinlineerr.go +++ b/noinlineerr.go @@ -57,9 +57,9 @@ func inlineErrorInspector(pass *analysis.Pass) func(n ast.Node) { continue } - // confirm type is error + // confirm type is error and it is used in condition obj := pass.TypesInfo.ObjectOf(ident) - if !isError(obj) || ident.Name == "_" { + if !isError(obj) || ident.Name == "_" || !errorUsedInCondition(ifStmt.Cond, ident.Name) { continue } @@ -132,3 +132,23 @@ func shadowVarsExists(name string, scope *types.Scope) bool { return parentScope.Lookup(name) != nil } + +func errorUsedInCondition(cond ast.Expr, errIdentName string) bool { + used := false + + ast.Inspect(cond, func(n ast.Node) bool { + ident, ok := n.(*ast.Ident) + if !ok { + return true + } + + if ident.Name == errIdentName { + used = true + return false + } + + return true + }) + + return used +} diff --git a/testdata/src/a/main.go b/testdata/src/a/main.go index 832c02a..de02284 100644 --- a/testdata/src/a/main.go +++ b/testdata/src/a/main.go @@ -52,6 +52,11 @@ func valid() error { if ok, _ := strconv.ParseBool("1"); ok { fmt.Println("ok") } + + var myErr MyAliasErr + if err, ok := myErr.(error); ok { + fmt.Println("ok", err) + } return nil } diff --git a/testdata/src/a/main.go.golden b/testdata/src/a/main.go.golden index d8a52d1..8e65c8b 100644 --- a/testdata/src/a/main.go.golden +++ b/testdata/src/a/main.go.golden @@ -54,6 +54,11 @@ func valid() error { fmt.Println("ok") } + var myErr MyAliasErr + if err, ok := myErr.(error); ok { + fmt.Println("ok", err) + } + return nil }