diff options
author | 2015-09-25 21:35:26 +0000 | |
---|---|---|
committer | 2015-09-28 11:39:40 +0000 | |
commit | e27d06308902f44b53809cffd23fc8064e8a7297 (patch) | |
tree | 8b04c86cf20edc174bb230e33ab455b38fb9bd73 /src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java | |
parent | 7bd3e023e4791468efe06a989645d56c8cf880a4 (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.java | 61 |
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 |