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);