OpenPeeDeeP / depguard

Go linter that checks if package imports are in a list of acceptable packages.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Expose the real `Run` function

ldez opened this issue · comments

It's complex to explain but it's a simple problem.

Inside golangci-lint, we instantiate all the linters several times (one for the CLI help, one for the run, etc.) but because of the error reported by compile inside NewAnalyzer, if an error occurs during the call to NewAnalyzer then golangci-lint fails.
This implies that an error can happen when a user calls golangci-lint version or golangci-lint help.

I created a change in our fork to be able to control the error: golangci@4f22f85.
You can see the use inside golangci-lint: https://github.com/golangci/golangci-lint/pull/3880/files

I don't want to keep this fork, can we think about a change to the lib API?
The changes inside our fork are just a possibility, we can find other solutions.

Just so I am understand, This is more of an issue that NewAnalyzer can potentially fail due to bad configuration passed in?

The goal with having it before the analyzer is created, please correct me if I am wrong, was to reduce the amount of computation needed to perform the analysis. compile is only called once where Run can be called many times over with different contexts passed in. compile was supposed to be expensive so that Run can just do its thing.

Briefly looking at golangci-lint's WithContextSetter, it would allow the compile to occur only once, right?

Would something like #51 do what is needed. That way golangci-lint doesn't have to modify the returned analyzer. Just call NewUncompiledAnalyzer then use the Compile method in the WithContextSetter.

This is more of an issue that NewAnalyzer can potentially fail due to bad configuration passed in?

yes

The goal with having it before the analyzer is created, please correct me if I am wrong, was to reduce the amount of computation needed to perform the analysis.

No, it's not a way to reduce computation needed to perform the analysis but a way to not impact users that don't use depguard when an error occurs during compile.
But in the end, the solution is the same.

Briefly looking at golangci-lint's WithContextSetter, it would allow the compile to occur only once, right?

yes and no: we need to call the NewAnalyzer to have information about the linter, WithContextSetter is only called when we run the linter. (build vs run)
WithContextSetter is called only one time.

Would something like #51 do what is needed.

Your solution is oriented on the protection of internals, it feels to me like a complex solution instead of just exposing the internal but it will work and it's easy to use.

v2.1.0 has been tagged with these changes. Thanks for the help and clearification!

Thank you for the quick changes and the release, I will open a PR on golangci-lint update to use the new version.