diff options
| author | Teddy Wing | 2023-05-18 23:42:59 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2023-05-18 23:42:59 +0200 | 
| commit | 1d6aca277d7a2a617810daa74fc0a01d6bd5f776 (patch) | |
| tree | 5ff1225c4678540dc2dab2aa8b3ba99ec7717fff | |
| parent | 9993783a0d2fc7e087e6370288ed191cfa292a9f (diff) | |
| download | godefererr-1d6aca277d7a2a617810daa74fc0a01d6bd5f776.tar.bz2 | |
Find assignments in defer closure
| -rw-r--r-- | defererr.go | 27 | 
1 files changed, 26 insertions, 1 deletions
| 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  					},  				) | 
