Similar to TargetMarkerValue, have TargetPatternValue *not* embed Targets.

[]TESTED: See

--
MOS_MIGRATED_REVID=91816612
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 7a29564..ebc2c96 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.cmdline.TargetPattern;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.graph.Digraph;
 import com.google.devtools.build.lib.packages.NoSuchThingException;
 import com.google.devtools.build.lib.packages.Package;
@@ -149,6 +150,7 @@
     return allowedLabels;
   }
 
+  @Override
   public Collection<Target> getFwdDeps(Target target) {
     Collection<Target> unfilteredDeps = getRawFwdDeps(target);
     if (!(target instanceof Rule)) {
@@ -164,6 +166,7 @@
         });
   }
 
+  @Override
   public Collection<Target> getReverseDeps(final Target target) {
     return Collections2.filter(getRawReverseDeps(target), new Predicate<Target>() {
       @Override
@@ -314,8 +317,21 @@
     }
   }
 
+  private static Target getExistingTarget(Label label,
+      GraphBackedRecursivePackageProvider provider) {
+    StoredEventHandler handler = new StoredEventHandler();
+    try {
+      return provider.getTarget(handler, label);
+    } catch (NoSuchThingException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  @Override
   protected Map<String, ResolvedTargets<Target>> preloadOrThrow(QueryExpression caller,
       Collection<String> patterns) throws QueryException, TargetParsingException {
+    GraphBackedRecursivePackageProvider provider =
+        new GraphBackedRecursivePackageProvider(graph);
     Map<String, ResolvedTargets<Target>> result = Maps.newHashMapWithExpectedSize(patterns.size());
     for (String pattern : patterns) {
       SkyKey patternKey = TargetPatternValue.key(pattern,
@@ -326,10 +342,17 @@
 
       TargetParsingException targetParsingException = null;
       if (graph.exists(patternKey)) {
-        // If the graph already contains a value for this target pattern, use it.
+        // The graph already contains a value or exception for this target pattern, so we use it.
         TargetPatternValue value = (TargetPatternValue) graph.getValue(patternKey);
         if (value != null) {
-          result.put(pattern, value.getTargets());
+          ResolvedTargets.Builder<Target> targetsBuilder = ResolvedTargets.builder();
+          for (Label label : value.getTargets().getTargets()) {
+            targetsBuilder.add(getExistingTarget(label, provider));
+          }
+          for (Label label : value.getTargets().getFilteredTargets()) {
+            targetsBuilder.remove(getExistingTarget(label, provider));
+          }
+          result.put(pattern, targetsBuilder.build());
         } else {
           targetParsingException =
               (TargetParsingException)
@@ -339,8 +362,6 @@
         // If the graph doesn't contain a value for this target pattern, try to directly evaluate
         // it, by making use of packages already present in the graph.
         TargetPattern.Parser parser = new TargetPattern.Parser(targetPattern.getOffset());
-        GraphBackedRecursivePackageProvider provider =
-            new GraphBackedRecursivePackageProvider(graph);
         RecursivePackageProviderBackedTargetPatternResolver resolver =
             new RecursivePackageProviderBackedTargetPatternResolver(provider, eventHandler,
                 targetPattern.getPolicy(), pkgPath);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
index 09d2ec5..8bccd2d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
@@ -19,6 +19,7 @@
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -78,6 +79,7 @@
 import java.nio.channels.ClosedByInterruptException;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -299,6 +301,16 @@
       this.env = env;
     }
 
+    private static Target getExistingTarget(Label label,
+        Map<PackageIdentifier, Package> packages) {
+      try {
+        return packages.get(label.getPackageIdentifier()).getTarget(label.getName());
+      } catch (NoSuchTargetException e) {
+        // Unexpected since the label was part of the TargetPatternValue.
+        throw new IllegalStateException(e);
+      }
+    }
+
     @Override
     public Map<String, ResolvedTargets<Target>> preloadTargetPatterns(EventHandler eventHandler,
                                                                Collection<String> patterns,
@@ -308,25 +320,74 @@
       boolean ok = true;
       Map<String, ResolvedTargets<Target>> preloadedPatterns =
           Maps.newHashMapWithExpectedSize(patterns.size());
-      Map<SkyKey, String> keys = Maps.newHashMapWithExpectedSize(patterns.size());
+      Map<SkyKey, String> patternKeys = Maps.newHashMapWithExpectedSize(patterns.size());
       for (String pattern : patterns) {
         checkValidPatternType(pattern);
-        keys.put(TargetPatternValue.key(pattern, FilteringPolicies.NO_FILTER, ""), pattern);
+        patternKeys.put(TargetPatternValue.key(pattern, FilteringPolicies.NO_FILTER, ""), pattern);
       }
+      Set<SkyKey> packageKeys = new HashSet<>();
+      Map<String, ResolvedTargets<Label>> resolvedLabelsMap =
+          Maps.newHashMapWithExpectedSize(patterns.size());
       synchronized (this) {
         for (Map.Entry<SkyKey, ValueOrException<TargetParsingException>> entry :
-          env.getValuesOrThrow(keys.keySet(), TargetParsingException.class).entrySet()) {
+          env.getValuesOrThrow(patternKeys.keySet(), TargetParsingException.class).entrySet()) {
           TargetPatternValue patternValue = (TargetPatternValue) entry.getValue().get();
           if (patternValue == null) {
             ok = false;
           } else {
-            preloadedPatterns.put(keys.get(entry.getKey()), patternValue.getTargets());
+            ResolvedTargets<Label> resolvedLabels = patternValue.getTargets();
+            resolvedLabelsMap.put(patternKeys.get(entry.getKey()), resolvedLabels);
+            for (Label label
+                : Iterables.concat(resolvedLabels.getTargets(),
+                    resolvedLabels.getFilteredTargets())) {
+              packageKeys.add(PackageValue.key(label.getPackageIdentifier()));
+            }
           }
         }
       }
       if (!ok) {
         throw new SkyframeRestartQueryException();
       }
+      Map<PackageIdentifier, Package> packages =
+          Maps.newHashMapWithExpectedSize(packageKeys.size());
+      synchronized (this) {
+        for (Map.Entry<SkyKey, ValueOrException<NoSuchPackageException>> entry :
+          env.getValuesOrThrow(packageKeys, NoSuchPackageException.class).entrySet()) {
+          PackageIdentifier pkgName = (PackageIdentifier) entry.getKey().argument();
+          Package pkg = null;
+          try {
+            PackageValue packageValue = (PackageValue) entry.getValue().get();
+            if (packageValue == null) {
+              ok = false;
+              continue;
+            }
+            pkg = packageValue.getPackage();
+          } catch (NoSuchPackageException nspe) {
+            if (nspe.getPackage() != null) {
+              pkg = nspe.getPackage();
+            } else {
+              continue;
+            }
+          }
+          Preconditions.checkNotNull(pkg, pkgName);
+          packages.put(pkgName, pkg);
+        }
+      }
+      if (!ok) {
+        throw new SkyframeRestartQueryException();
+      }
+      for (Map.Entry<String, ResolvedTargets<Label>> entry : resolvedLabelsMap.entrySet()) {
+        String pattern = entry.getKey();
+        ResolvedTargets<Label> resolvedLabels = resolvedLabelsMap.get(pattern);
+        ResolvedTargets.Builder<Target> builder = ResolvedTargets.builder();
+        for (Label label : resolvedLabels.getTargets()) {
+          builder.add(getExistingTarget(label, packages));
+        }
+        for (Label label : resolvedLabels.getFilteredTargets()) {
+          builder.remove(getExistingTarget(label, packages));
+        }
+        preloadedPatterns.put(pattern, builder.build());
+      }
       return preloadedPatterns;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java
index fe90910..1ea4c0f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java
@@ -21,9 +21,9 @@
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
-import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.pkgcache.ParseFailureListener;
 import com.google.devtools.build.lib.skyframe.PrepareDepsOfPatternsValue.TargetPatternSequence;
+import com.google.devtools.build.lib.syntax.Label;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
@@ -61,7 +61,7 @@
     EventHandler eventHandler = env.getListener();
     boolean handlerIsParseFailureListener = eventHandler instanceof ParseFailureListener;
 
-    ResolvedTargets.Builder<Target> builder = ResolvedTargets.builder();
+    ResolvedTargets.Builder<Label> builder = ResolvedTargets.builder();
     for (SkyKey key : patternSkyKeys) {
       try {
         // The only exception type throwable by TargetPatternFunction is TargetParsingException.
@@ -69,7 +69,7 @@
         // TargetParsingException when get is called.
         TargetPatternValue resultValue = Preconditions.checkNotNull(
             (TargetPatternValue) targetPatternValuesByKey.get(key).get());
-        ResolvedTargets<Target> results = resultValue.getTargets();
+        ResolvedTargets<Label> results = resultValue.getTargets();
         if (((TargetPatternValue.TargetPattern) key.argument()).isNegative()) {
           builder.filter(Predicates.not(Predicates.in(results.getTargets())));
         } else {
@@ -80,11 +80,11 @@
         handleTargetParsingException(eventHandler, handlerIsParseFailureListener, key, e);
       }
     }
-    ResolvedTargets<Target> resolvedTargets = builder.build();
+    ResolvedTargets<Label> resolvedTargets = builder.build();
 
     List<SkyKey> targetKeys = new ArrayList<>();
-    for (Target target : resolvedTargets.getTargets()) {
-      targetKeys.add(TransitiveTargetValue.key(target.getLabel()));
+    for (Label target : resolvedTargets.getTargets()) {
+      targetKeys.add(TransitiveTargetValue.key(target));
     }
 
     // TransitiveTargetFunction can produce exceptions of types NoSuchPackageException and
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
index 8b8209a..0ea6fc2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
@@ -22,18 +22,26 @@
 import com.google.devtools.build.lib.cmdline.TargetParsingException;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.packages.NoSuchPackageException;
+import com.google.devtools.build.lib.packages.NoSuchTargetException;
+import com.google.devtools.build.lib.packages.Package;
+import com.google.devtools.build.lib.packages.PackageIdentifier;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.pkgcache.FilteringPolicy;
 import com.google.devtools.build.lib.pkgcache.ParseFailureListener;
 import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator;
+import com.google.devtools.build.lib.syntax.Label;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.ErrorInfo;
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.WalkableGraph;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Skyframe-based target pattern parsing.
@@ -95,6 +103,36 @@
        SkyframeExecutor.DEFAULT_THREAD_COUNT, keepGoing, eventHandler);
   }
 
+  private static Map<PackageIdentifier, Package> getPackages(
+      Set<PackageIdentifier> packagesToRequest, WalkableGraph walkableGraph) {
+    Map<PackageIdentifier, Package> packages =
+        Maps.newHashMapWithExpectedSize(packagesToRequest.size());
+    for (PackageIdentifier pkgIdentifier : packagesToRequest) {
+      SkyKey key = PackageValue.key(pkgIdentifier);
+      Package pkg = null;
+      NoSuchPackageException nspe = (NoSuchPackageException) walkableGraph.getException(key);
+      if (nspe != null) {
+        pkg = nspe.getPackage();
+      } else {
+        pkg = ((PackageValue) walkableGraph.getValue(key)).getPackage();
+      }
+      // Unexpected since the label was part of the TargetPatternValue.
+      Preconditions.checkNotNull(pkg, pkgIdentifier);
+      packages.put(pkgIdentifier, pkg);
+    }
+    return packages;
+  }
+
+  private static Target getExistingTarget(Label label, Map<PackageIdentifier, Package> packages) {
+    Package pkg = Preconditions.checkNotNull(packages.get(label.getPackageIdentifier()), label);
+    try {
+      return pkg.getTarget(label.getName());
+    } catch (NoSuchTargetException e) {
+      // Unexpected since the label was part of the TargetPatternValue.
+      throw new IllegalStateException(e);
+    }
+  }
+
   ResolvedTargets<Target> parseTargetPatternKeys(Iterable<SkyKey> patternSkyKeys, int numThreads,
       boolean keepGoing, EventHandler eventHandler)
       throws InterruptedException, TargetParsingException {
@@ -102,15 +140,15 @@
         skyframeExecutor.targetPatterns(patternSkyKeys, numThreads, keepGoing, eventHandler);
 
     String errorMessage = null;
-    ResolvedTargets.Builder<Target> builder = ResolvedTargets.builder();
+    ResolvedTargets.Builder<Label> resolvedLabelsBuilder = ResolvedTargets.builder();
     for (SkyKey key : patternSkyKeys) {
       TargetPatternValue resultValue = result.get(key);
       if (resultValue != null) {
-        ResolvedTargets<Target> results = resultValue.getTargets();
+        ResolvedTargets<Label> results = resultValue.getTargets();
         if (((TargetPatternValue.TargetPattern) key.argument()).isNegative()) {
-          builder.filter(Predicates.not(Predicates.in(results.getTargets())));
+          resolvedLabelsBuilder.filter(Predicates.not(Predicates.in(results.getTargets())));
         } else {
-          builder.merge(results);
+          resolvedLabelsBuilder.merge(results);
         }
       } else {
         TargetPatternValue.TargetPattern pattern =
@@ -133,7 +171,7 @@
         if (keepGoing) {
           eventHandler.handle(Event.error("Skipping '" + rawPattern + "': " + errorMessage));
         }
-        builder.setError();
+        resolvedLabelsBuilder.setError();
 
         if (eventHandler instanceof ParseFailureListener) {
           ParseFailureListener parseListener = (ParseFailureListener) eventHandler;
@@ -146,6 +184,24 @@
       Preconditions.checkState(errorMessage != null, "unexpected errors: %s", result.errorMap());
       throw new TargetParsingException(errorMessage);
     }
-    return builder.build();
+    ResolvedTargets<Label> resolvedLabels = resolvedLabelsBuilder.build();
+    Set<PackageIdentifier> packagesToRequest = new HashSet<>();
+    for (Label label
+        : Iterables.concat(resolvedLabels.getTargets(), resolvedLabels.getFilteredTargets())) {
+      packagesToRequest.add(label.getPackageIdentifier());
+    }
+    WalkableGraph walkableGraph = Preconditions.checkNotNull(result.getWalkableGraph(), result);
+    Map<PackageIdentifier, Package> packages = getPackages(packagesToRequest, walkableGraph);
+    ResolvedTargets.Builder<Target> resolvedTargetsBuilder = ResolvedTargets.builder();
+    if (resolvedLabels.hasError()) {
+      resolvedTargetsBuilder.setError();
+    }
+    for (Label label : resolvedLabels.getTargets()) {
+      resolvedTargetsBuilder.add(getExistingTarget(label, packages));
+    }
+    for (Label label : resolvedLabels.getFilteredTargets()) {
+      resolvedTargetsBuilder.remove(getExistingTarget(label, packages));
+    }
+    return resolvedTargetsBuilder.build();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
index 9322998..1f4a91e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
@@ -13,10 +13,14 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
+import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.cmdline.ResolvedTargets;
 import com.google.devtools.build.lib.cmdline.TargetParsingException;
 import com.google.devtools.build.lib.cmdline.TargetPattern;
+import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.EnvironmentBackedRecursivePackageProvider.MissingDepException;
+import com.google.devtools.build.lib.syntax.Label;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyFunctionException;
 import com.google.devtools.build.skyframe.SkyKey;
@@ -44,6 +48,7 @@
     TargetPatternValue.TargetPattern patternKey =
         ((TargetPatternValue.TargetPattern) key.argument());
     TargetPattern.Parser parser = new TargetPattern.Parser(patternKey.getOffset());
+    ResolvedTargets<Target> resolvedTargets = null;
     try {
       EnvironmentBackedRecursivePackageProvider provider =
           new EnvironmentBackedRecursivePackageProvider(env);
@@ -51,7 +56,7 @@
           new RecursivePackageProviderBackedTargetPatternResolver(provider, env.getListener(),
               patternKey.getPolicy(), pkgPath.get());
       TargetPattern resolvedPattern = parser.parse(patternKey.getPattern());
-      return new TargetPatternValue(resolvedPattern.eval(resolver));
+      resolvedTargets = resolvedPattern.eval(resolver);
     } catch (TargetParsingException e) {
       throw new TargetPatternFunctionException(e);
     } catch (MissingDepException e) {
@@ -62,6 +67,15 @@
       // implementations that are unconcerned with MissingDepExceptions.
       return null;
     }
+    Preconditions.checkNotNull(resolvedTargets, key);
+    ResolvedTargets.Builder<Label> resolvedLabelsBuilder = ResolvedTargets.builder();
+    for (Target target : resolvedTargets.getTargets()) {
+      resolvedLabelsBuilder.add(target.getLabel());
+    }
+    for (Target target : resolvedTargets.getFilteredTargets()) {
+      resolvedLabelsBuilder.remove(target.getLabel());
+    }
+    return new TargetPatternValue(resolvedLabelsBuilder.build());
   }
 
   @Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
index c97194f..50cdc9b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
@@ -19,12 +19,10 @@
 import com.google.devtools.build.lib.cmdline.ResolvedTargets.Builder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-import com.google.devtools.build.lib.packages.NoSuchTargetException;
-import com.google.devtools.build.lib.packages.Package;
-import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.pkgcache.FilteringPolicies;
 import com.google.devtools.build.lib.pkgcache.FilteringPolicy;
 import com.google.devtools.build.lib.syntax.Label;
+import com.google.devtools.build.lib.syntax.Label.SyntaxException;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
@@ -34,12 +32,8 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
-import java.util.Set;
 
 /**
  * A value referring to a computed set of resolved targets. This is used for the results of target
@@ -49,62 +43,50 @@
 @ThreadSafe
 public final class TargetPatternValue implements SkyValue {
 
-  private ResolvedTargets<Target> targets;
+  private ResolvedTargets<Label> targets;
 
-  TargetPatternValue(ResolvedTargets<Target> targets) {
+  TargetPatternValue(ResolvedTargets<Label> targets) {
     this.targets = Preconditions.checkNotNull(targets);
   }
 
   private void writeObject(ObjectOutputStream out) throws IOException {
-    Set<Package> packages = new LinkedHashSet<>();
     List<String> ts = new ArrayList<>();
     List<String> filteredTs = new ArrayList<>();
-    for (Target target : targets.getTargets()) {
-      packages.add(target.getPackage());
-      ts.add(target.getLabel().toString());
+    for (Label target : targets.getTargets()) {
+      ts.add(target.toString());
     }
-    for (Target target : targets.getFilteredTargets()) {
-      packages.add(target.getPackage());
-      filteredTs.add(target.getLabel().toString());
+    for (Label target : targets.getFilteredTargets()) {
+      filteredTs.add(target.toString());
     }
 
-    out.writeObject(packages);
     out.writeObject(ts);
     out.writeObject(filteredTs);
   }
 
+  private Label labelFromString(String labelString) {
+    try {
+      return Label.parseAbsolute(labelString);
+    } catch (SyntaxException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
   @SuppressWarnings("unchecked")
   private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-    Set<Package> packages = (Set<Package>) in.readObject();
     List<String> ts = (List<String>) in.readObject();
     List<String> filteredTs = (List<String>) in.readObject();
 
-    Map<String, Package> packageMap = new HashMap<>();
-    for (Package p : packages) {
-      packageMap.put(p.getName(), p);
-    }
-
-    Builder<Target> builder = ResolvedTargets.<Target>builder();
+    Builder<Label> builder = ResolvedTargets.<Label>builder();
     for (String labelString : ts) {
-      builder.add(lookupTarget(packageMap, labelString));
+      builder.add(labelFromString(labelString));
     }
 
     for (String labelString : filteredTs) {
-      builder.remove(lookupTarget(packageMap, labelString));
+      builder.remove(labelFromString(labelString));
     }
     this.targets = builder.build();
   }
 
-  private static Target lookupTarget(Map<String, Package> packageMap, String labelString) {
-    Label label = Label.parseAbsoluteUnchecked(labelString);
-    Package p = packageMap.get(label.getPackageName());
-    try {
-      return p.getTarget(label.getName());
-    } catch (NoSuchTargetException e) {
-      throw new IllegalStateException(e);
-    }
-  }
-
   @SuppressWarnings("unused")
   private void readObjectNoData() {
     throw new IllegalStateException();
@@ -148,7 +130,7 @@
      return keys;
    }
 
-  public ResolvedTargets<Target> getTargets() {
+  public ResolvedTargets<Label> getTargets() {
     return targets;
   }