From 1d6aca277d7a2a617810daa74fc0a01d6bd5f776 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Thu, 18 May 2023 23:42:59 +0200 Subject: Find assignments in defer closure --- defererr.go | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'defererr.go') diff --git a/defererr.go b/defererr.go index ae5f688..6bd1188 100644 --- a/defererr.go +++ b/defererr.go @@ -4,6 +4,7 @@ package defererr import ( "fmt" "go/ast" + "go/token" "golang.org/x/tools/go/analysis" ) @@ -39,7 +40,7 @@ func run(pass *analysis.Pass) (interface{}, error) { returnIdent, ok := returnVal.Type.(*ast.Ident) if !ok { - return true + return true } if returnIdent.Name == "error" { @@ -68,6 +69,30 @@ func run(pass *analysis.Pass) (interface{}, error) { // TODO: Find out if defer uses assigns an error variable without declaring it + funcLit, ok := deferStmt.Call.Fun.(*ast.FuncLit) + if !ok { + return true + } + + ast.Inspect( + funcLit.Body, + func(node ast.Node) bool { + assignStmt, ok := node.(*ast.AssignStmt) + if !ok { + return true + } + + if assignStmt.Tok == token.DEFINE { + return true + } + + fmt.Printf("assignStmt: %#v\n", assignStmt) + fmt.Printf("token: %d\n", token.DEFINE) + + return true + }, + ) + return true }, ) -- cgit v1.2.3