Age | Commit message (Collapse) | Author |
|
Match the `varDeclarations` function splitting this into a more
self-contained block.
Also don't return in the loop to ensure we look at all assignments in
`assignStmt`.
|
|
Declarations can include multiple identifiers. Return all of these from
the function and rename it accordingly.
|
|
Treat these as shadowed variables and ignore them.
|
|
This doesn't pass yet.
|
|
* Add descriptive comments.
* Remove old in-progress code.
* Change the function name to `findLocalAssignments` which made more
sense given what the function now does.
|
|
In order to ignore shadowed variables, we first build a list of all
local assignments in the closure, and ignore any ident in that list.
|
|
|
|
Not working yet. Does print the right thing, but since we're also
matching `*ast.Ident`s, we must be getting the shadowed declarations as
Idents and including them in the reported diagnostics.
|
|
We don't want to report shadowed variables.
|
|
It doesn't need to be attached to the `funcScope` condition as it's a
separate check. Wasn't thinking carefully when I added the check.
|
|
|
|
|
|
|
|
Don't report captured function values:
$ go test
--- FAIL: Test (1.26s)
analysistest.go:459: ./testdata/function_argument.go:5:3:
unexpected diagnostic: captured reference callback in goroutine
closure
|
|
|
|
|
|
|
|
|
|
|
|
It's not used in `run()`, so we can move it here.
|
|
|
|
* Remove old in-progress code now that we have a working implementation.
* Add explanatory comments.
* Remove `assignmentsInFunc()` which is unused.
|
|
|
|
Remove old unused in-progress code.
|
|
|
|
Easier to use than `goStmt.Call.Args` because we don't have to handle
both `*ast.Expr` and `*ast.UnaryExpr`.
|
|
|
|
Otherwise we can get `*types.TypeName` identifiers, like the variable
types in the closure's argument list. We only want to inspect variables.
|
|
These items don't pass our tests.
|
|
This correctly ignores local variables.
|
|
Report all variables declared in an outer scope.
This does match variables defined in the closure too. Will need to fix
that.
|
|
Follow `golang.org/x/tools/go/analysis/passes/testinggoroutine` to write
the test runner:
https://github.com/golang/tools/blob/1c9fe3f82c363b929ef7239ca0ad8a5dafbbcf05/go/analysis/passes/testinggoroutine/testinggoroutine_test.go
Add "want" comments to test code for validation.
|
|
Decided not to use my personal Git host directly for the module, but a
new domain specific to Go modules. This could allow me to host the code
elsewhere using a vanity module name.
|
|
|
|
|
|
For every identifier in the closure, check if it exists in an outer
scope.
|
|
|
|
If I had read the comment for `Scopes` in
https://godocs.io/go/types#Info I would have known that only a subset of
`ast.Node` can appear in the `Scopes` field. Tried ones until I ended up
with valid scopes.
Now that we have a valid scope, maybe we can find out if it's using
variables not declared within that scope.
|
|
Just results in nil.
|
|
|
|
Discovered this existed.
|
|
Not working, as `funcObj` is nil.
|
|
Debugging and ideas for getting variables defined in this closure's
scope.
|
|
Got this idea from a question by zhizhixiong
(https://stackoverflow.com/users/12073516/zhizhixiong) on Stack
Overflow:
https://stackoverflow.com/questions/66544145/how-to-find-the-declaration-of-an-ident-using-go-analysis
This seems to correctly print defines and assigns. It doesn't print the
`decl` variable though.
|
|
|
|
This field could maybe tell us whether it was a `:=` assignment
(token.DEFINE) or `=` (token.ASSIGN), but it seems like it's always
`token.DEFINE`.
|
|
Turns out this only gets declarations like:
var decl string
but not:
decl := "a"
Is there a way to get the above one too?
|
|
These should be reported as well, because they're shared references even
though they're passed as arguments.
This currently reports the variable name as "aStruct", will need to look
into how to correct that.
|
|
|
|
|