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 }