diff options
author | Teddy Wing | 2023-05-20 17:28:14 +0200 |
---|---|---|
committer | Teddy Wing | 2023-05-20 17:28:14 +0200 |
commit | c064b2142aa81488e32be387393c494d98696a55 (patch) | |
tree | 3f8ce0d21eb464e283b300be7175f96016b459de | |
parent | ec33e063b86ae2c5208d856ee1a36259f342d5e0 (diff) | |
download | gocapturedrefrace-c064b2142aa81488e32be387393c494d98696a55.tar.bz2 |
Fix panic when go statement calls non-function-literal
-rw-r--r-- | capturedrefrace.go | 9 | ||||
-rw-r--r-- | testdata/function_local.go | 10 |
2 files changed, 19 insertions, 0 deletions
diff --git a/capturedrefrace.go b/capturedrefrace.go index e7431ac..7ed7470 100644 --- a/capturedrefrace.go +++ b/capturedrefrace.go @@ -51,6 +51,7 @@ package capturedrefrace import ( + "fmt" "go/ast" "go/token" "go/types" @@ -93,12 +94,20 @@ func run(pass *analysis.Pass) (interface{}, error) { case *ast.Ident: // Get a function literal stored in a local variable. funcLit, ok = funcLitFromIdent(goStmtFunc) + + default: + return } if !ok { return } // Inspect closure argument list. + fmt.Printf("ident: %#v\n", goStmt.Call.Fun) + fmt.Printf("pos: %#v\n", pass.Fset.Position(goStmt.Call.Fun.Pos())) + fmt.Printf("lit: %#v\n", funcLit) + fmt.Printf("type: %#v\n", funcLit.Type) + fmt.Printf("params: %#v\n", funcLit.Type.Params) for _, arg := range funcLit.Type.Params.List { // Report reference arguments. _, ok := arg.Type.(*ast.StarExpr) diff --git a/testdata/function_local.go b/testdata/function_local.go index 18eeca5..6687889 100644 --- a/testdata/function_local.go +++ b/testdata/function_local.go @@ -28,3 +28,13 @@ func functionLocal() { go funcLocal() } + +type ValueMethodStruct struct {} + +func (s ValueMethodStruct) method() {} + +func ignoreValueMethods() { + s := ValueMethodStruct{} + + go s.method() +} |