aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2017-01-09 20:12:57 +0000
committerGravatar Marcel Hlopko <hlopko@google.com>2017-01-10 10:21:58 +0000
commitb91d3922246310e5b2e8cde456d897611c571155 (patch)
tree5c6782b483b42f8b63f7c5706035a6cfab6f89aa /src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
parent441dac4afac458042b093c9a3fc689aa72a90d41 (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.java68
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