aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2016-04-22 15:29:12 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-04-22 21:19:14 +0000
commit549bfce438156c7a26bb37449b947a60d35eab91 (patch)
tree075b4e217d49c60b1835b7686b8e44b2b65753e3 /src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
parenta4e9deeeb27dffc203e1bdac2b3b98fb11bf123c (diff)
Make aspects work through bind().
bind() is assumed to be able to provide any provider. This is suboptimal, but beats the alternative of traversing the dependency graph to an arbitrary depth. The reason for the removal of the iteration ability in TransitiveInfoCollection is that now aspects can be attached to BindConfiguredTarget, too, which is not a RuleConfiguredTarget. Whereas I could have implemented the iterator, it was used only in BindConfiguredTarget anyway, so there didn't seem to be much reason to. Some work towards #952. -- MOS_MIGRATED_REVID=120549877
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
index 2070ff2b66..35fdc9ab15 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
@@ -39,19 +39,20 @@ import javax.annotation.Nullable;
@Immutable
@ThreadSafe
public class TransitiveTraversalValue implements SkyValue {
-
+ private final boolean canHaveAnyProvider;
@Nullable private final ImmutableSet<String> providers;
@Nullable private final String firstErrorMessage;
- private TransitiveTraversalValue(
+ private TransitiveTraversalValue(boolean canHaveAnyProvider,
@Nullable Iterable<String> providers, @Nullable String firstErrorMessage) {
+ this.canHaveAnyProvider = canHaveAnyProvider;
this.providers = (providers == null) ? null : canonicalSet(providers);
this.firstErrorMessage =
(firstErrorMessage == null) ? null : StringCanonicalizer.intern(firstErrorMessage);
}
public static TransitiveTraversalValue unsuccessfulTransitiveTraversal(String firstErrorMessage) {
- return new TransitiveTraversalValue(null, Preconditions.checkNotNull(firstErrorMessage));
+ return new TransitiveTraversalValue(false, null, Preconditions.checkNotNull(firstErrorMessage));
}
public static TransitiveTraversalValue forTarget(
@@ -59,14 +60,16 @@ public class TransitiveTraversalValue implements SkyValue {
if (target instanceof Rule) {
Rule rule = (Rule) target;
return new TransitiveTraversalValue(
- toStringSet(rule.getRuleClassObject().getAdvertisedProviders()), firstErrorMessage);
+ rule.getRuleClassObject().canHaveAnyProvider(),
+ toStringSet(rule.getRuleClassObject().getAdvertisedProviders()),
+ firstErrorMessage);
}
- return new TransitiveTraversalValue(ImmutableList.<String>of(), firstErrorMessage);
+ return new TransitiveTraversalValue(false, ImmutableList.<String>of(), firstErrorMessage);
}
public static TransitiveTraversalValue withProviders(
Collection<String> providers, @Nullable String firstErrorMessage) {
- return new TransitiveTraversalValue(ImmutableSet.copyOf(providers), firstErrorMessage);
+ return new TransitiveTraversalValue(false, ImmutableSet.copyOf(providers), firstErrorMessage);
}
private static ImmutableSet<String> canonicalSet(Iterable<String> strIterable) {
@@ -88,6 +91,13 @@ public class TransitiveTraversalValue implements SkyValue {
}
/**
+ * Returns if the associated target can have any provider. True for "alias" rules.
+ */
+ public boolean canHaveAnyProvider() {
+ return canHaveAnyProvider;
+ }
+
+ /**
* Returns the set of provider names from the target, if the target is a {@link Rule}. If there
* were errors loading the target, returns {@code null}.
*/
@@ -115,12 +125,13 @@ public class TransitiveTraversalValue implements SkyValue {
}
TransitiveTraversalValue that = (TransitiveTraversalValue) o;
return Objects.equals(this.firstErrorMessage, that.firstErrorMessage)
- && Objects.equals(this.providers, that.providers);
+ && Objects.equals(this.providers, that.providers)
+ && Objects.equals(this.canHaveAnyProvider, canHaveAnyProvider);
}
@Override
public int hashCode() {
- return 31 * Objects.hashCode(firstErrorMessage) + Objects.hashCode(providers);
+ return Objects.hash(firstErrorMessage, providers, canHaveAnyProvider);
}
@ThreadSafe