Age | Commit message (Collapse) | Author |
|
|
|
* 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.
|
|
|
|
|
|
Turns out this isn't what we want, as assignments means assignments. I
was actually thinking of declarations.
|
|
|
|
Don't report variables that were passed as arguments to the closure.
|
|
|
|
|
|
This does ignore "strings" and "Repeat" in the "simple.go" test file.
|
|
Need to refine our identifier filtering.
|
|
We want to ignore local variables.
|
|
Second usage of captured reference is reported as expected. That seems
correct for our needs.
|
|
Inspect function literals run by `go` statements, and find all variables
in those function literals.
|
|
Build a basic Go analyser that finds `go` statements.
Currently testing this with:
$ go run ./cmd/gocapturedrefrace ./testdata/
Using the following tutorials as a guide:
* https://arslan.io/2019/06/13/using-go-analysis-to-write-a-custom-linter/
* https://scribe.rip/codex/writing-custom-linter-in-go-54ef6f8080
|
|
|