From 1edc8e83c8971a61ace316267a21e03f34f687e6 Mon Sep 17 00:00:00 2001 From: Ian Cottrell Date: Thu, 13 Jun 2019 10:10:44 -0400 Subject: [PATCH] internal/lsp: update analysis runner for new features This adds support for the AllObjectFacts and AllPackageFacts features that were added to the analysis library. It also moves the list of analyzers to an exported global so it can be added to easily. Change-Id: Ibbe81b17b190d04a0e49510c23558430bc03ca70 Reviewed-on: https://go-review.googlesource.com/c/tools/+/182177 Run-TryBot: Ian Cottrell TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob --- internal/lsp/source/analysis.go | 20 ++++++++++++ internal/lsp/source/diagnostics.go | 52 ++++++++++++++++-------------- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/internal/lsp/source/analysis.go b/internal/lsp/source/analysis.go index b1e777f5..c599e674 100644 --- a/internal/lsp/source/analysis.go +++ b/internal/lsp/source/analysis.go @@ -155,6 +155,8 @@ func (act *Action) execOnce(ctx context.Context, fset *token.FileSet) error { ExportObjectFact: act.exportObjectFact, ImportPackageFact: act.importPackageFact, ExportPackageFact: act.exportPackageFact, + AllObjectFacts: act.allObjectFacts, + AllPackageFacts: act.allPackageFacts, } act.pass = pass @@ -252,6 +254,15 @@ func (act *Action) exportObjectFact(obj types.Object, fact analysis.Fact) { act.objectFacts[key] = fact // clobber any existing entry } +// allObjectFacts implements Pass.AllObjectFacts. +func (act *Action) allObjectFacts() []analysis.ObjectFact { + facts := make([]analysis.ObjectFact, 0, len(act.objectFacts)) + for k := range act.objectFacts { + facts = append(facts, analysis.ObjectFact{Object: k.obj, Fact: act.objectFacts[k]}) + } + return facts +} + // importPackageFact implements Pass.ImportPackageFact. // Given a non-nil pointer ptr of type *T, where *T satisfies Fact, // fact copies the fact value to *ptr. @@ -284,3 +295,12 @@ func factType(fact analysis.Fact) reflect.Type { } return t } + +// allObjectFacts implements Pass.AllObjectFacts. +func (act *Action) allPackageFacts() []analysis.PackageFact { + facts := make([]analysis.PackageFact, 0, len(act.packageFacts)) + for k := range act.packageFacts { + facts = append(facts, analysis.PackageFact{Package: k.pkg, Fact: act.packageFacts[k]}) + } + return facts +} diff --git a/internal/lsp/source/diagnostics.go b/internal/lsp/source/diagnostics.go index b7b74b7a..f15c6c9a 100644 --- a/internal/lsp/source/diagnostics.go +++ b/internal/lsp/source/diagnostics.go @@ -234,33 +234,35 @@ func singleDiagnostic(uri span.URI, format string, a ...interface{}) map[span.UR } } -func runAnalyses(ctx context.Context, v View, pkg Package, disabledAnalyses map[string]struct{}, report func(a *analysis.Analyzer, diag analysis.Diagnostic) error) error { +var Analyzers = []*analysis.Analyzer{ // The traditional vet suite: + asmdecl.Analyzer, + assign.Analyzer, + atomic.Analyzer, + atomicalign.Analyzer, + bools.Analyzer, + buildtag.Analyzer, + cgocall.Analyzer, + composite.Analyzer, + copylock.Analyzer, + httpresponse.Analyzer, + loopclosure.Analyzer, + lostcancel.Analyzer, + nilfunc.Analyzer, + printf.Analyzer, + shift.Analyzer, + stdmethods.Analyzer, + structtag.Analyzer, + tests.Analyzer, + unmarshal.Analyzer, + unreachable.Analyzer, + unsafeptr.Analyzer, + unusedresult.Analyzer, +} + +func runAnalyses(ctx context.Context, v View, pkg Package, disabledAnalyses map[string]struct{}, report func(a *analysis.Analyzer, diag analysis.Diagnostic) error) error { var analyzers []*analysis.Analyzer - for _, a := range []*analysis.Analyzer{ - asmdecl.Analyzer, - assign.Analyzer, - atomic.Analyzer, - atomicalign.Analyzer, - bools.Analyzer, - buildtag.Analyzer, - cgocall.Analyzer, - composite.Analyzer, - copylock.Analyzer, - httpresponse.Analyzer, - loopclosure.Analyzer, - lostcancel.Analyzer, - nilfunc.Analyzer, - printf.Analyzer, - shift.Analyzer, - stdmethods.Analyzer, - structtag.Analyzer, - tests.Analyzer, - unmarshal.Analyzer, - unreachable.Analyzer, - unsafeptr.Analyzer, - unusedresult.Analyzer, - } { + for _, a := range Analyzers { if _, ok := disabledAnalyses[a.Name]; ok { continue }