You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
go/analysis/checker: a go/packages-based driver library
The {single,multi}checker packages provide the main function
for a complete application, as a black box. Many users want
the ability to customize the analyzer behavior with additional
logic, as described in the attached issues.
This change creates a new package, go/analysis/checker, that
exposes an Analyze pure function---one that avoids global flags,
os.Exit, logging, profiling, and other side effects---that
runs a set of analyzers on a set of packages loaded (by the
client) using go/packages, and presents the graph of results
in a form that allows postprocessing.
package checker
func Analyze([]*analysis.Analyzer, []*packages.Package, *Options) (*Graph, error)
type Graph struct {
Roots []*Action
}
type Action struct { ... } // information about each step
func (*Graph) WriteJSONDiagnostics(io.Writer) error
func (*Graph) WriteTextDiagnostics(io.Writer, contextLines int) error
func (*Graph) All() iter.Seq[*Action] // (was Visit in the proposal)
See the example_test.go file for typical API usage.
API feedback welcome.
This change should have no effect on the behavior of
existing programs. Logic changes have been kept to a
minimum, so the large diffs are mostly code motion.
Auxiliary functions for printing, flags, fixes,
and so on has been kept to a minimum so that we
can make progress on this change.
They will be dealt with in follow-up changes.
Detailed list of changes to ease review:
analysistest:
- Run: we report Load errors to t.Log up front
(unless RunDespiteErrors); this was previously in loadPackages.
- Run: the Validate call is now done by checker.Analyze.
- internal/checker.TestAnalyzer has melted away
- the logic to construct the "legacy" Result slice is new.
- Result: this type used to be an alias for
internal/checker.checker.TestAnalyzerResult (regrettably
exposing more than intended); now it is a plain public struct.
- check: the logic to check fact expectations is new.
- The buildtag and directive analyzers both used a similar
hack w.r.t. IgnoredFiles; this hack is now in analysistest.
Better ideas welcome.
checker:
- checker.go is mostly moved from internal/checker/checker.go.
- print.go is mostly split from old printDiagnostics in
internal/checker/checker.go.
- Action.execOnce: the pass.Result/Err logic was simplified
using an immediately-applied lambda.
- inheritFacts: the comments on package-fact handling are new.
- Graph.Visit is "born deprecated".
Clients using go1.23 should use Graph.All (iter.Seq).
- Example: this is new code.
internal/checker:
- applyFixes: now accepts only the actions to apply, without
calling visitAll over the action graph.
The previous code was wrong, a latent bug.
Some files outside go/analysis were updated, not out of
necessity (it's not a breaking change) but to modernize
them (e.g. avoiding analysistest.Result.Pass).
Updates golang/go#61324 (new API proposal)
Fixesgolang/go#53215 (feature proposal)
Fixesgolang/go#31897Fixesgolang/go#50265Fixesgolang/go#53336Fixesgolang/go#66745
Updates golang/go#30231
Updates golang/go#30219
Updates golang/go#31007
Updates golang/go#66745
Change-Id: I745d319a587dca506564a4624b52a7f1eb5f4751
Reviewed-on: https://go-review.googlesource.com/c/tools/+/411907
Reviewed-by: Robert Findley <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
0 commit comments