diff options
author | Teddy Wing | 2023-05-17 19:51:29 +0200 |
---|---|---|
committer | Teddy Wing | 2023-05-17 19:51:29 +0200 |
commit | 4054b6fdd71811304e4bc7af8c8799becc5338a0 (patch) | |
tree | 920b77205acdbc8e2ccd76d74e96f5ca9ad617a2 | |
parent | 52dbd96539f74b180c11c7ed1e2c83ed49c3f8bc (diff) | |
download | gocapturedrefrace-4054b6fdd71811304e4bc7af8c8799becc5338a0.tar.bz2 |
Ignore captured variables containing functions
-rw-r--r-- | gocapturedrefrace.go | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/gocapturedrefrace.go b/gocapturedrefrace.go index e44b397..66be1e9 100644 --- a/gocapturedrefrace.go +++ b/gocapturedrefrace.go @@ -16,7 +16,6 @@ // along with Gocapturedrefrace. If not, see // <https://www.gnu.org/licenses/>. - // TODO: package documentation. package gocapturedrefrace @@ -52,8 +51,6 @@ func run(pass *analysis.Pass) (interface{}, error) { // Inspect closure argument list. for _, arg := range funcLit.Type.Params.List { - // TODO: Ignore closures passed as arguments. - // Report reference arguments. _, ok := arg.Type.(*ast.StarExpr) if !ok { @@ -104,15 +101,20 @@ func checkClosure(pass *analysis.Pass, funcLit *ast.FuncLit) { } // Ignore non-variable identifiers. - _, ok = scopeObj.(*types.Var) + variable, ok := scopeObj.(*types.Var) if !ok { return true } + // Ignore captured callable variables, like function arguments. + _, isVariableTypeSignature := variable.Type().(*types.Signature) + // TODO: Ignore shadowing variables. // Identifier was defined in a different scope. - if funcScope != scope { + if funcScope != scope && + !isVariableTypeSignature { + pass.Reportf( ident.Pos(), "captured reference %s in goroutine closure", |