aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java95
1 files changed, 75 insertions, 20 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
index 339e4313cf..8e818f3df1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
@@ -14,10 +14,13 @@
package com.google.devtools.build.lib.skyframe;
import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.packages.AspectDefinition;
+import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.InputFile;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
@@ -35,9 +38,10 @@ import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
import com.google.devtools.build.skyframe.ValueOrException;
+import java.util.Collection;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
/**
@@ -97,8 +101,43 @@ public class TransitiveTargetFunction implements SkyFunction {
transitiveUnsuccessfulPkgs.add(packageId);
}
transitiveTargets.add(target.getLabel());
- for (Map.Entry<SkyKey, ValueOrException<NoSuchThingException>> entry :
- env.getValuesOrThrow(getLabelDepKeys(target), NoSuchThingException.class).entrySet()) {
+
+ // Process deps from attributes of current target.
+ Iterable<SkyKey> depKeys = getLabelDepKeys(target);
+ successfulTransitiveLoading &= processDeps(env, target, transitiveRootCauses,
+ transitiveSuccessfulPkgs, transitiveUnsuccessfulPkgs, transitiveTargets, depKeys);
+ if (env.valuesMissing()) {
+ return null;
+ }
+ // Process deps from aspects.
+ depKeys = getLabelAspectKeys(target, env);
+ successfulTransitiveLoading &= processDeps(env, target, transitiveRootCauses,
+ transitiveSuccessfulPkgs, transitiveUnsuccessfulPkgs, transitiveTargets, depKeys);
+ if (env.valuesMissing()) {
+ return null;
+ }
+
+ NestedSet<PackageIdentifier> successfullyLoadedPackages = transitiveSuccessfulPkgs.build();
+ NestedSet<PackageIdentifier> unsuccessfullyLoadedPackages = transitiveUnsuccessfulPkgs.build();
+ NestedSet<Label> loadedTargets = transitiveTargets.build();
+ if (successfulTransitiveLoading) {
+ return TransitiveTargetValue.successfulTransitiveLoading(successfullyLoadedPackages,
+ unsuccessfullyLoadedPackages, loadedTargets);
+ } else {
+ NestedSet<Label> rootCauses = transitiveRootCauses.build();
+ return TransitiveTargetValue.unsuccessfulTransitiveLoading(successfullyLoadedPackages,
+ unsuccessfullyLoadedPackages, loadedTargets, rootCauses, errorLoadingTarget);
+ }
+ }
+
+ private boolean processDeps(Environment env, Target target,
+ NestedSetBuilder<Label> transitiveRootCauses,
+ NestedSetBuilder<PackageIdentifier> transitiveSuccessfulPkgs,
+ NestedSetBuilder<PackageIdentifier> transitiveUnsuccessfulPkgs,
+ NestedSetBuilder<Label> transitiveTargets, Iterable<SkyKey> depKeys) {
+ boolean successfulTransitiveLoading = true;
+ for (Entry<SkyKey, ValueOrException<NoSuchThingException>> entry :
+ env.getValuesOrThrow(depKeys, NoSuchThingException.class).entrySet()) {
Label depLabel = (Label) entry.getKey().argument();
TransitiveTargetValue transitiveTargetValue;
try {
@@ -129,22 +168,7 @@ public class TransitiveTargetFunction implements SkyFunction {
}
}
}
-
- if (env.valuesMissing()) {
- return null;
- }
-
- NestedSet<PackageIdentifier> successfullyLoadedPackages = transitiveSuccessfulPkgs.build();
- NestedSet<PackageIdentifier> unsuccessfullyLoadedPackages = transitiveUnsuccessfulPkgs.build();
- NestedSet<Label> loadedTargets = transitiveTargets.build();
- if (successfulTransitiveLoading) {
- return TransitiveTargetValue.successfulTransitiveLoading(successfullyLoadedPackages,
- unsuccessfullyLoadedPackages, loadedTargets);
- } else {
- NestedSet<Label> rootCauses = transitiveRootCauses.build();
- return TransitiveTargetValue.unsuccessfulTransitiveLoading(successfullyLoadedPackages,
- unsuccessfullyLoadedPackages, loadedTargets, rootCauses, errorLoadingTarget);
- }
+ return successfulTransitiveLoading;
}
@Override
@@ -169,6 +193,33 @@ public class TransitiveTargetFunction implements SkyFunction {
}
}
+ private static Iterable<SkyKey> getLabelAspectKeys(Target target, Environment env) {
+ List<SkyKey> depKeys = Lists.newArrayList();
+ if (target instanceof Rule) {
+ Multimap<Attribute, Label> transitions =
+ ((Rule) target).getTransitions(Rule.NO_NODEP_ATTRIBUTES);
+ for (Entry<Attribute, Label> entry : transitions.entries()) {
+ SkyKey packageKey = PackageValue.key(entry.getValue().getPackageIdentifier());
+ try {
+ PackageValue pkgValue = (PackageValue) env.getValueOrThrow(packageKey,
+ NoSuchThingException.class);
+ if (pkgValue == null) {
+ continue;
+ }
+ Collection<Label> labels = AspectDefinition.visitAspectsIfRequired(target, entry.getKey(),
+ pkgValue.getPackage().getTarget(entry.getValue().getName())).values();
+ for (Label label : labels) {
+ depKeys.add(TransitiveTargetValue.key(label));
+ }
+ } catch (NoSuchThingException e) {
+ // Do nothing. This error was handled when we computed the corresponding
+ // TransitiveTargetValue.
+ }
+ }
+ }
+ return depKeys;
+ }
+
private static Iterable<SkyKey> getLabelDepKeys(Target target) {
List<SkyKey> depKeys = Lists.newArrayList();
for (Label depLabel : getLabelDeps(target)) {
@@ -188,13 +239,17 @@ public class TransitiveTargetFunction implements SkyFunction {
visitTargetVisibility(target, labels);
} else if (target instanceof Rule) {
visitTargetVisibility(target, labels);
- labels.addAll(((Rule) target).getLabels(Rule.NO_NODEP_ATTRIBUTES));
+ visitRule(target, labels);
} else if (target instanceof PackageGroup) {
visitPackageGroup((PackageGroup) target, labels);
}
return labels;
}
+ private static void visitRule(Target target, Set<Label> labels) {
+ labels.addAll(((Rule) target).getLabels(Rule.NO_NODEP_ATTRIBUTES));
+ }
+
private static void visitTargetVisibility(Target target, Set<Label> labels) {
labels.addAll(target.getVisibility().getDependencyLabels());
}