diff options
author | Teddy Wing | 2023-05-15 02:27:38 +0200 |
---|---|---|
committer | Teddy Wing | 2023-05-15 02:27:38 +0200 |
commit | 47f01bb1f6e75a071c6ee9c7e070b0c03634be40 (patch) | |
tree | d61246fd7d78c3418a9223b3c1fe4626d59458c8 /gocapturedrefrace.go | |
parent | 6d91d473f24d6825170e494852b26ffc748fe542 (diff) | |
download | gocapturedrefrace-47f01bb1f6e75a071c6ee9c7e070b0c03634be40.tar.bz2 |
Find variables in `go func` closures
Inspect function literals run by `go` statements, and find all variables
in those function literals.
Diffstat (limited to 'gocapturedrefrace.go')
-rw-r--r-- | gocapturedrefrace.go | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/gocapturedrefrace.go b/gocapturedrefrace.go index 762473b..21a0d16 100644 --- a/gocapturedrefrace.go +++ b/gocapturedrefrace.go @@ -2,6 +2,7 @@ package gocapturedrefrace import ( "bytes" + "fmt" "go/ast" "go/printer" @@ -30,11 +31,16 @@ func run(pass *analysis.Pass) (interface{}, error) { panic(err) } - pass.Reportf( - goStmt.Pos(), - "go statement found %q", - printedNode, - ) + fmt.Printf("%#v\n", goStmt) + + // TODO: Get func literal of go statement + // TODO: Get variables in func literal + funcLit, ok := goStmt.Call.Fun.(*ast.FuncLit) + if !ok { + return true + } + + checkClosure(pass, funcLit) return true }, @@ -43,3 +49,23 @@ func run(pass *analysis.Pass) (interface{}, error) { return nil, nil } + +func checkClosure(pass *analysis.Pass, funcLit *ast.FuncLit) { + ast.Inspect( + funcLit, + func(node ast.Node) bool { + variable, ok := node.(*ast.Ident) + if !ok { + return true + } + + pass.Reportf( + variable.Pos(), + "variable found %q", + variable, + ) + + return true + }, + ) +} |