diff options
author | 2017-01-17 10:25:28 +0000 | |
---|---|---|
committer | 2017-01-17 12:15:42 +0000 | |
commit | f868b3e0a43be9f4466f119f13c41c906d54f004 (patch) | |
tree | dc4b8988ee4cff4827fec789e5dba8a4448d5845 /src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java | |
parent | d747d522128e2dd0fff204d0ecbf36dcf0a439c8 (diff) |
Add ability to specify required aspect providers for aspects.
It is just a specification yet, it does nothing.
--
PiperOrigin-RevId: 144687428
MOS_MIGRATED_REVID=144687428
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java index 92f6d0cb39..58b8fea8ee 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java @@ -32,7 +32,6 @@ import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import javax.annotation.Nullable; /** @@ -57,6 +56,7 @@ public final class AspectDefinition { private final AspectClass aspectClass; private final RequiredProviders requiredProviders; + private final RequiredProviders requiredProvidersForAspects; private final ImmutableMap<String, Attribute> attributes; private final PropagationFunction attributeAspects; @Nullable private final ConfigurationFragmentPolicy configurationFragmentPolicy; @@ -68,11 +68,13 @@ public final class AspectDefinition { private AspectDefinition( AspectClass aspectClass, RequiredProviders requiredProviders, + RequiredProviders requiredAspectProviders, ImmutableMap<String, Attribute> attributes, PropagationFunction attributeAspects, @Nullable ConfigurationFragmentPolicy configurationFragmentPolicy) { this.aspectClass = aspectClass; this.requiredProviders = requiredProviders; + this.requiredProvidersForAspects = requiredAspectProviders; this.attributes = attributes; this.attributeAspects = attributeAspects; @@ -108,6 +110,15 @@ public final class AspectDefinition { } /** + * Aspects do not depend on other aspects applied to the same target <em>unless</em> + * the other aspect satisfies the {@link RequiredProviders} this method returns + */ + public RequiredProviders getRequiredProvidersForAspects() { + return requiredProvidersForAspects; + } + + + /** * Returns the set of required aspects for a given atribute. */ public ImmutableCollection<AspectClass> getAttributeAspects(Attribute attribute) { @@ -203,6 +214,8 @@ public final class AspectDefinition { private final AspectClass aspectClass; private final Map<String, Attribute> attributes = new LinkedHashMap<>(); private RequiredProviders.Builder requiredProviders = RequiredProviders.acceptAnyBuilder(); + private RequiredProviders.Builder requiredAspectProviders = + RequiredProviders.acceptNoneBuilder(); private final Multimap<String, AspectClass> attributeAspects = LinkedHashMultimap.create(); private ImmutableCollection<AspectClass> allAttributesAspects = null; private final ConfigurationFragmentPolicy.Builder configurationFragmentPolicy = @@ -216,9 +229,9 @@ public final class AspectDefinition { * Asserts that this aspect can only be evaluated for rules that supply all of the providers * from at least one set of required providers. */ - public Builder requireProviderSets(Iterable<? extends Set<Class<?>>> providerSets) { - for (Set<Class<?>> providerSet : providerSets) { - requiredProviders.addNativeSet(ImmutableSet.copyOf(providerSet)); + public Builder requireProviderSets(Iterable<ImmutableSet<Class<?>>> providerSets) { + for (ImmutableSet<Class<?>> providerSet : providerSets) { + requiredProviders.addNativeSet(providerSet); } return this; } @@ -232,6 +245,25 @@ public final class AspectDefinition { return this; } + public Builder requireAspectsWithProviders( + Iterable<ImmutableSet<SkylarkProviderIdentifier>> providerSets) { + for (ImmutableSet<SkylarkProviderIdentifier> providerSet : providerSets) { + if (!providerSet.isEmpty()) { + requiredAspectProviders.addSkylarkSet(providerSet); + } + } + return this; + } + + public Builder requireAspectsWithNativeProviders( + Iterable<ImmutableSet<SkylarkProviderIdentifier>> providerSets) { + for (ImmutableSet<SkylarkProviderIdentifier> providerSet : providerSets) { + requiredAspectProviders.addSkylarkSet(providerSet); + } + return this; + } + + /** * Declares that this aspect depends on the given aspects in {@code aspectFactories} provided * by direct dependencies through attribute {@code attribute} on the target associated with this @@ -240,7 +272,6 @@ public final class AspectDefinition { * <p>Note that {@code ConfiguredAspectFactory} instances are expected in the second argument, * but we cannot reference that interface here. */ - @SafeVarargs public final Builder attributeAspect(String attribute, NativeAspectClass... aspectClasses) { Preconditions.checkNotNull(attribute); for (NativeAspectClass aspectClass : aspectClasses) { @@ -398,7 +429,9 @@ public final class AspectDefinition { * <p>The builder object is reusable afterwards. */ public AspectDefinition build() { - return new AspectDefinition(aspectClass, requiredProviders.build(), + return new AspectDefinition(aspectClass, + requiredProviders.build(), + requiredAspectProviders.build(), ImmutableMap.copyOf(attributes), allAttributesAspects != null ? new AllAttributesPropagationFunction(allAttributesAspects) |