gopls/internal/lsp/cache: reduce type-checking in renameImports

Before, package renaming would type-check the entire reverse
transitive closure. This change avoids type checking for indirect
reverse dependencies, or when the package's (leaf) name hasn't
changed.

The references operation also uses the new APIs (to request metadata
separate from type checking), and uses it to avoid type checking
entirely when computing references to a package name,
but doesn't yet economize on the set of packages it type checks
in the general case. That will come in a follow-up; eventually
of course it will be based on a search index, not type checking.

Also:
- fix vendoring issues flagged by TODO.
- Snapshot.ReverseDependencies now returns only metadata, no type checking.
- metadataGraph.reverseTransitiveClosure returns a map.
- added source.RemoveIntermediateTestVariants helper.
- deleted snapshot.checkedPackage, no longer needed.

Change-Id: Ia17c9d9c7922a45cf9b6e1bb86c4919a60da0215
Reviewed-on: https://go-review.googlesource.com/c/tools/+/456759
Run-TryBot: Alan Donovan <adonovan@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
diff --git a/gopls/internal/lsp/cache/snapshot.go b/gopls/internal/lsp/cache/snapshot.go
index c518aca..1818d0e 100644
--- a/gopls/internal/lsp/cache/snapshot.go
+++ b/gopls/internal/lsp/cache/snapshot.go
@@ -643,17 +643,17 @@
 		return nil, err
 	}
 
-	var ids []PackageID
-	for _, m := range metas {
-		// Filter out any intermediate test variants.
-		// We typically aren't interested in these
-		// packages for file= style queries.
-		if m.IsIntermediateTestVariant() && !includeTestVariants {
-			continue
-		}
-		ids = append(ids, m.ID)
+	// Optionally filter out any intermediate test variants.
+	// We typically aren't interested in these
+	// packages for file= style queries.
+	if !includeTestVariants {
+		metas = source.RemoveIntermediateTestVariants(metas)
 	}
 
+	ids := make([]PackageID, len(metas))
+	for i, m := range metas {
+		ids[i] = m.ID
+	}
 	return s.TypeCheck(ctx, mode, ids...)
 }
 
@@ -818,35 +818,21 @@
 	return metas, nil
 }
 
-func (s *snapshot) GetReverseDependencies(ctx context.Context, id PackageID) ([]source.Package, error) {
+func (s *snapshot) ReverseDependencies(ctx context.Context, id PackageID) (map[PackageID]*source.Metadata, error) {
 	if err := s.awaitLoaded(ctx); err != nil {
 		return nil, err
 	}
 	s.mu.Lock()
 	meta := s.meta
 	s.mu.Unlock()
-	ids := meta.reverseTransitiveClosure(id)
+	rdeps := meta.reverseTransitiveClosure(id)
 
-	// Make sure to delete the original package ID from the map.
-	delete(ids, id)
+	// Remove the original package ID from the map.
+	// TODO(adonovan): we should make ReverseDependencies and
+	// reverseTransitiveClosure consistent wrt reflexiveness.
+	delete(rdeps, id)
 
-	var pkgs []source.Package
-	for id := range ids {
-		pkg, err := s.checkedPackage(ctx, id, s.workspaceParseMode(id))
-		if err != nil {
-			return nil, err
-		}
-		pkgs = append(pkgs, pkg)
-	}
-	return pkgs, nil
-}
-
-func (s *snapshot) checkedPackage(ctx context.Context, id PackageID, mode source.ParseMode) (*pkg, error) {
-	ph, err := s.buildPackageHandle(ctx, id, mode)
-	if err != nil {
-		return nil, err
-	}
-	return ph.await(ctx, s)
+	return rdeps, nil
 }
 
 func (s *snapshot) getImportedBy(id PackageID) []PackageID {