1
0
mirror of https://github.com/golang/go synced 2024-10-01 03:18:33 -06:00

go/analysis: proposed fact enumeration API

Updates golang/go#29616

Change-Id: Ibaf10526ea35f06b853ad55451a50750c764fab4
Reviewed-on: https://go-review.googlesource.com/c/tools/+/174379
Run-TryBot: Michael Matloob <matloob@golang.org>
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Michael Matloob 2019-04-29 16:34:09 -04:00
parent 83df196e57
commit 5cec639030
2 changed files with 42 additions and 0 deletions

View File

@ -128,10 +128,32 @@ type Pass struct {
// See comments for ExportObjectFact. // See comments for ExportObjectFact.
ExportPackageFact func(fact Fact) ExportPackageFact func(fact Fact)
// AllPackageFacts returns a new slice containing all package facts in unspecified order.
// WARNING: This is an experimental API and may change in the future.
AllPackageFacts func() []PackageFact
// AllObjectFacts returns a new slice containing all object facts in unspecified order.
// WARNING: This is an experimental API and may change in the future.
AllObjectFacts func() []ObjectFact
/* Further fields may be added in future. */ /* Further fields may be added in future. */
// For example, suggested or applied refactorings. // For example, suggested or applied refactorings.
} }
// PackageFact is a package together with an associated fact.
// WARNING: This is an experimental API and may change in the future.
type PackageFact struct {
Package *types.Package
Fact Fact
}
// ObjectFact is an object together with an associated fact.
// WARNING: This is an experimental API and may change in the future.
type ObjectFact struct {
Object types.Object
Fact Fact
}
// Reportf is a helper function that reports a Diagnostic using the // Reportf is a helper function that reports a Diagnostic using the
// specified position and formatted error message. // specified position and formatted error message.
func (pass *Pass) Reportf(pos token.Pos, format string, args ...interface{}) { func (pass *Pass) Reportf(pos token.Pos, format string, args ...interface{}) {

View File

@ -503,6 +503,8 @@ func (act *action) execOnce() {
ExportObjectFact: act.exportObjectFact, ExportObjectFact: act.exportObjectFact,
ImportPackageFact: act.importPackageFact, ImportPackageFact: act.importPackageFact,
ExportPackageFact: act.exportPackageFact, ExportPackageFact: act.exportPackageFact,
AllObjectFacts: act.allObjectFacts,
AllPackageFacts: act.allPackageFacts,
} }
act.pass = pass act.pass = pass
@ -666,6 +668,15 @@ func (act *action) exportObjectFact(obj types.Object, fact analysis.Fact) {
} }
} }
// 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{k.obj, act.objectFacts[k]})
}
return facts
}
// importPackageFact implements Pass.ImportPackageFact. // importPackageFact implements Pass.ImportPackageFact.
// Given a non-nil pointer ptr of type *T, where *T satisfies Fact, // Given a non-nil pointer ptr of type *T, where *T satisfies Fact,
// fact copies the fact value to *ptr. // fact copies the fact value to *ptr.
@ -703,4 +714,13 @@ func factType(fact analysis.Fact) reflect.Type {
return t 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{k.pkg, act.packageFacts[k]})
}
return facts
}
func dbg(b byte) bool { return strings.IndexByte(Debug, b) >= 0 } func dbg(b byte) bool { return strings.IndexByte(Debug, b) >= 0 }