aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeddy Wing2023-05-15 02:27:38 +0200
committerTeddy Wing2023-05-15 02:27:38 +0200
commit47f01bb1f6e75a071c6ee9c7e070b0c03634be40 (patch)
treed61246fd7d78c3418a9223b3c1fe4626d59458c8
parent6d91d473f24d6825170e494852b26ffc748fe542 (diff)
downloadgocapturedrefrace-47f01bb1f6e75a071c6ee9c7e070b0c03634be40.tar.bz2
Find variables in `go func` closures
Inspect function literals run by `go` statements, and find all variables in those function literals.
-rw-r--r--gocapturedrefrace.go36
-rw-r--r--testdata/simple.go2
2 files changed, 33 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
+ },
+ )
+}
diff --git a/testdata/simple.go b/testdata/simple.go
index 496be52..4b4c23a 100644
--- a/testdata/simple.go
+++ b/testdata/simple.go
@@ -2,8 +2,10 @@ package main
func main() {
capturedReference := 0
+ capturedReference2 := 1
go func() {
capturedReference += 1
+ capturedReference2 += 1
}()
}