go/analysis: update internal/facts and unit checker to support all(Package|Object)Facts methods

Change-Id: Ibae7a87417be49941a5e4970c25df2ff48b346a7
Reviewed-on: https://go-review.googlesource.com/c/tools/+/185978
Run-TryBot: Michael Matloob <matloob@golang.org>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
diff --git a/go/analysis/internal/facts/facts.go b/go/analysis/internal/facts/facts.go
index 468f148..86f1ce8 100644
--- a/go/analysis/internal/facts/facts.go
+++ b/go/analysis/internal/facts/facts.go
@@ -99,6 +99,16 @@
 	s.mu.Unlock()
 }
 
+func (s *Set) AllObjectFacts() []analysis.ObjectFact {
+	var facts []analysis.ObjectFact
+	for k, v := range s.m {
+		if k.obj != nil {
+			facts = append(facts, analysis.ObjectFact{k.obj, v})
+		}
+	}
+	return facts
+}
+
 // ImportPackageFact implements analysis.Pass.ImportPackageFact.
 func (s *Set) ImportPackageFact(pkg *types.Package, ptr analysis.Fact) bool {
 	if pkg == nil {
@@ -122,6 +132,16 @@
 	s.mu.Unlock()
 }
 
+func (s *Set) AllPackageFacts() []analysis.PackageFact {
+	var facts []analysis.PackageFact
+	for k, v := range s.m {
+		if k.obj == nil {
+			facts = append(facts, analysis.PackageFact{k.pkg, v})
+		}
+	}
+	return facts
+}
+
 // gobFact is the Gob declaration of a serialized fact.
 type gobFact struct {
 	PkgPath string          // path of package
diff --git a/go/analysis/unitchecker/unitchecker.go b/go/analysis/unitchecker/unitchecker.go
index ba2e66f..87c3160 100644
--- a/go/analysis/unitchecker/unitchecker.go
+++ b/go/analysis/unitchecker/unitchecker.go
@@ -334,8 +334,10 @@
 				Report:            func(d analysis.Diagnostic) { act.diagnostics = append(act.diagnostics, d) },
 				ImportObjectFact:  facts.ImportObjectFact,
 				ExportObjectFact:  facts.ExportObjectFact,
+				AllObjectFacts:    facts.AllObjectFacts,
 				ImportPackageFact: facts.ImportPackageFact,
 				ExportPackageFact: facts.ExportPackageFact,
+				AllPackageFacts:   facts.AllPackageFacts,
 			}
 
 			t0 := time.Now()