diff options
author | Dmitry Lomov <dslomov@google.com> | 2017-01-09 20:12:57 +0000 |
---|---|---|
committer | Marcel Hlopko <hlopko@google.com> | 2017-01-10 10:21:58 +0000 |
commit | b91d3922246310e5b2e8cde456d897611c571155 (patch) | |
tree | 5c6782b483b42f8b63f7c5706035a6cfab6f89aa /src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java | |
parent | 441dac4afac458042b093c9a3fc689aa72a90d41 (diff) |
Extract a set of advertised providers into a separate class.
--
PiperOrigin-RevId: 143991903
MOS_MIGRATED_REVID=143991903
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 | 68 |
1 files changed, 18 insertions, 50 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 24ed4bb6c7..d0e9d4a79d 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 @@ -13,11 +13,10 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -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.AdvertisedProviderSet; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.Target; @@ -25,15 +24,9 @@ import com.google.devtools.build.lib.util.Preconditions; 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.ArrayList; -import java.util.Collection; -import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; - import javax.annotation.Nullable; /** @@ -47,7 +40,7 @@ import javax.annotation.Nullable; @ThreadSafe public class TransitiveTraversalValue implements SkyValue { private static final TransitiveTraversalValue EMPTY_VALUE = - new TransitiveTraversalValue(false, ImmutableSet.<String>of(), null); + new TransitiveTraversalValue(AdvertisedProviderSet.EMPTY, null); // A quick-lookup cache that allows us to get the value for a given RuleClass, assuming no error // messages for the target. Only stores built-in RuleClass objects to avoid memory bloat. private static final ConcurrentMap<RuleClass, TransitiveTraversalValue> VALUES_BY_RULE_CLASS = @@ -65,23 +58,20 @@ public class TransitiveTraversalValue implements SkyValue { VALUE_INTERNER.intern(EMPTY_VALUE); } - private final boolean canHaveAnyProvider; - private final ImmutableSet<String> providers; + private final AdvertisedProviderSet advertisedProviders; @Nullable private final String firstErrorMessage; private TransitiveTraversalValue( - boolean canHaveAnyProvider, - ImmutableSet<String> providers, + AdvertisedProviderSet providers, @Nullable String firstErrorMessage) { - this.canHaveAnyProvider = canHaveAnyProvider; - this.providers = Preconditions.checkNotNull(providers); + this.advertisedProviders = Preconditions.checkNotNull(providers); this.firstErrorMessage = (firstErrorMessage == null) ? null : StringCanonicalizer.intern(firstErrorMessage); } static TransitiveTraversalValue unsuccessfulTransitiveTraversal(String firstErrorMessage) { return new TransitiveTraversalValue( - false, ImmutableSet.<String>of(), Preconditions.checkNotNull(firstErrorMessage)); + AdvertisedProviderSet.EMPTY, Preconditions.checkNotNull(firstErrorMessage)); } static TransitiveTraversalValue forTarget(Target target, @Nullable String firstErrorMessage) { @@ -93,8 +83,8 @@ public class TransitiveTraversalValue implements SkyValue { if (value != null) { return value; } - ImmutableSet<String> providers = canonicalSet(toList(ruleClass.getAdvertisedProviders())); - value = new TransitiveTraversalValue(ruleClass.canHaveAnyProvider(), providers, null); + AdvertisedProviderSet providers = ruleClass.getAdvertisedProviders(); + value = new TransitiveTraversalValue(providers, null); // May already be there from another RuleClass or a concurrent put. value = VALUE_INTERNER.intern(value); // May already be there from a concurrent put. @@ -104,25 +94,23 @@ public class TransitiveTraversalValue implements SkyValue { // If this is a Skylark rule, we may still get a cache hit from another RuleClass with the // same providers. return TransitiveTraversalValue.create( - ruleClass.canHaveAnyProvider(), - toList(rule.getRuleClassObject().getAdvertisedProviders()), + rule.getRuleClassObject().getAdvertisedProviders(), firstErrorMessage); } } if (firstErrorMessage == null) { return EMPTY_VALUE; } else { - return new TransitiveTraversalValue(false, ImmutableSet.<String>of(), firstErrorMessage); + return new TransitiveTraversalValue(AdvertisedProviderSet.EMPTY, firstErrorMessage); } } public static TransitiveTraversalValue create( - boolean canHaveAnyProvider, - Collection<String> providers, + AdvertisedProviderSet providers, @Nullable String firstErrorMessage) { TransitiveTraversalValue value = new TransitiveTraversalValue( - canHaveAnyProvider, canonicalSet(providers), firstErrorMessage); + providers, firstErrorMessage); if (firstErrorMessage == null) { TransitiveTraversalValue oldValue = VALUE_INTERNER.getCanonical(value); return oldValue == null ? value : oldValue; @@ -130,38 +118,19 @@ public class TransitiveTraversalValue implements SkyValue { return value; } - 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 List<String> toList(Collection<Class<?>> providers) { - if (providers == null) { - return ImmutableList.of(); - } - List<String> strings = new ArrayList<>(providers.size()); - for (Class<?> clazz : providers) { - strings.add(clazz.getName()); - } - return strings; - } - /** * Returns if the associated target can have any provider. True for "alias" rules. */ public boolean canHaveAnyProvider() { - return canHaveAnyProvider; + return advertisedProviders.canHaveAnyProvider(); } /** * Returns the set of provider names from the target, if the target is a {@link Rule}. Otherwise * returns the empty set. */ - public Set<String> getProviders() { - return providers; + public AdvertisedProviderSet getProviders() { + return advertisedProviders; } /** @@ -182,14 +151,13 @@ public class TransitiveTraversalValue implements SkyValue { return false; } TransitiveTraversalValue that = (TransitiveTraversalValue) o; - return this.canHaveAnyProvider == that.canHaveAnyProvider - && Objects.equals(this.firstErrorMessage, that.firstErrorMessage) - && this.providers.equals(that.providers); + return Objects.equals(this.firstErrorMessage, that.firstErrorMessage) + && this.advertisedProviders.equals(that.advertisedProviders); } @Override public int hashCode() { - return Objects.hash(firstErrorMessage, providers, canHaveAnyProvider); + return Objects.hash(firstErrorMessage, advertisedProviders); } @ThreadSafe |