aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
diff options
context:
space:
mode:
authorGravatar Eric Fellheimer <felly@google.com>2015-09-25 21:35:26 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-09-28 11:39:40 +0000
commite27d06308902f44b53809cffd23fc8064e8a7297 (patch)
tree8b04c86cf20edc174bb230e33ab455b38fb9bd73 /src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
parent7bd3e023e4791468efe06a989645d56c8cf880a4 (diff)
Clean up Aspect checks in query tests.
-- MOS_MIGRATED_REVID=103977080
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.java61
1 files changed, 51 insertions, 10 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 e01588b7a2..483167811a 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
@@ -14,14 +14,21 @@
package com.google.devtools.build.lib.skyframe;
import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.cmdline.Label;
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.Rule;
+import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.util.StringCanonicalizer;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
+import java.util.Collection;
import java.util.Objects;
+import java.util.Set;
import javax.annotation.Nullable;
@@ -35,20 +42,53 @@ public class TransitiveTraversalValue implements SkyValue {
@Nullable
private final NoSuchTargetException errorLoadingTarget;
+ @Nullable
+ private final ImmutableSet<String> providers;
- // Note that this value does not guarantee singleton-like reference equality for successful
- // {@link TransitiveTraversalValue}s because we use Java deserialization. Java deserialization can
- // create other instances.
- public static final TransitiveTraversalValue SUCCESSFUL_TRANSITIVE_TRAVERSAL_VALUE =
- new TransitiveTraversalValue(null);
+ private TransitiveTraversalValue(@Nullable Iterable<String> providers,
+ @Nullable NoSuchTargetException errorLoadingTarget) {
+ this.errorLoadingTarget = errorLoadingTarget;
+ this.providers = (providers == null) ? null : canonicalSet(providers);
+ }
public static TransitiveTraversalValue unsuccessfulTransitiveTraversal(
NoSuchTargetException errorLoadingTarget) {
- return new TransitiveTraversalValue(Preconditions.checkNotNull(errorLoadingTarget));
+ return new TransitiveTraversalValue(null, Preconditions.checkNotNull(errorLoadingTarget));
}
- private TransitiveTraversalValue(@Nullable NoSuchTargetException errorLoadingTarget) {
- this.errorLoadingTarget = errorLoadingTarget;
+ public static TransitiveTraversalValue forTarget(Target target) {
+ if (target instanceof Rule) {
+ Rule rule = (Rule) target;
+ return new TransitiveTraversalValue(
+ toStringSet(rule.getRuleClassObject().getAdvertisedProviders()), null);
+ }
+ return new TransitiveTraversalValue(ImmutableList.<String>of(), null);
+ }
+
+ public static TransitiveTraversalValue withProviders(Collection<String> vals) {
+ return new TransitiveTraversalValue(ImmutableSet.copyOf(vals), null);
+ }
+
+ private static ImmutableSet<String> canonicalSet(Iterable<String> strIterable) {
+ ImmutableSet.Builder<String> builder = new ImmutableSet.Builder<>();
+ for (String str : strIterable) {
+ builder.add(StringCanonicalizer.intern(str));
+ }
+ return builder.build();
+ }
+
+ private static ImmutableSet<String> toStringSet(Iterable<Class<?>> providers) {
+ ImmutableSet.Builder<String> pBuilder = new ImmutableSet.Builder<>();
+ if (providers != null) {
+ for (Class<?> clazz : providers) {
+ pBuilder.add(StringCanonicalizer.intern(clazz.getName()));
+ }
+ }
+ return pBuilder.build();
+ }
+
+ public Set<String> getProviders() {
+ return providers;
}
/** Returns the error, if any, from loading the target. */
@@ -66,12 +106,13 @@ public class TransitiveTraversalValue implements SkyValue {
return false;
}
TransitiveTraversalValue that = (TransitiveTraversalValue) o;
- return Objects.equals(this.errorLoadingTarget, that.errorLoadingTarget);
+ return Objects.equals(this.errorLoadingTarget, that.errorLoadingTarget)
+ && Objects.equals(this.providers, that.providers);
}
@Override
public int hashCode() {
- return Objects.hashCode(errorLoadingTarget);
+ return 31 * Objects.hashCode(errorLoadingTarget) + Objects.hashCode(providers);
}
@ThreadSafe