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 <iancottrell@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Matloob <matloob@golang.org>
This commit is contained in:
Ian Cottrell 2019-06-13 10:10:44 -04:00
parent ed0dc45079
commit 1edc8e83c8
2 changed files with 47 additions and 25 deletions

View File

@ -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
}

View File

@ -234,10 +234,8 @@ 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:
var analyzers []*analysis.Analyzer
for _, a := range []*analysis.Analyzer{
asmdecl.Analyzer,
assign.Analyzer,
atomic.Analyzer,
@ -260,7 +258,11 @@ func runAnalyses(ctx context.Context, v View, pkg Package, disabledAnalyses map[
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 Analyzers {
if _, ok := disabledAnalyses[a.Name]; ok {
continue
}