Allow aspects to adveritise providers they provide.
--
PiperOrigin-RevId: 146794883
MOS_MIGRATED_REVID=146794883
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 55b0616..c7e11c0 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
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.packages;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
@@ -52,6 +53,7 @@
@Immutable
public final class AspectDefinition {
private final AspectClass aspectClass;
+ private final AdvertisedProviderSet advertisedProviders;
private final RequiredProviders requiredProviders;
private final RequiredProviders requiredProvidersForAspects;
private final ImmutableMap<String, Attribute> attributes;
@@ -66,14 +68,21 @@
@Nullable private final ImmutableSet<String> restrictToAttributes;
@Nullable private final ConfigurationFragmentPolicy configurationFragmentPolicy;
+ public AdvertisedProviderSet getAdvertisedProviders() {
+ return advertisedProviders;
+ }
+
+
private AspectDefinition(
AspectClass aspectClass,
+ AdvertisedProviderSet advertisedProviders,
RequiredProviders requiredProviders,
RequiredProviders requiredAspectProviders,
ImmutableMap<String, Attribute> attributes,
@Nullable ImmutableSet<String> restrictToAttributes,
@Nullable ConfigurationFragmentPolicy configurationFragmentPolicy) {
this.aspectClass = aspectClass;
+ this.advertisedProviders = advertisedProviders;
this.requiredProviders = requiredProviders;
this.requiredProvidersForAspects = requiredAspectProviders;
@@ -217,6 +226,8 @@
public static final class Builder {
private final AspectClass aspectClass;
private final Map<String, Attribute> attributes = new LinkedHashMap<>();
+ private final AdvertisedProviderSet.Builder advertisedProviders =
+ AdvertisedProviderSet.builder();
private RequiredProviders.Builder requiredProviders = RequiredProviders.acceptAnyBuilder();
private RequiredProviders.Builder requiredAspectProviders =
RequiredProviders.acceptNoneBuilder();
@@ -267,6 +278,29 @@
return this;
}
+ /**
+ * State that the aspect being built provides given providers.
+ */
+ public Builder advertiseProvider(Class<?>... providers) {
+ for (Class<?> provider : providers) {
+ advertisedProviders.addNative(provider);
+ }
+ return this;
+ }
+
+ /**
+ * State that the aspect being built provides given providers.
+ */
+ public Builder advertiseProvider(ImmutableList<SkylarkProviderIdentifier> providers) {
+ for (SkylarkProviderIdentifier provider : providers) {
+ // todo(dslomov,vladmos): support declared providers
+ Preconditions.checkState(provider.isLegacy());
+ advertisedProviders.addSkylark(provider.getLegacyId());
+ }
+ return this;
+ }
+
+
/**
* Declares that this aspect propagates along an {@code attribute} on the target
@@ -402,6 +436,7 @@
*/
public AspectDefinition build() {
return new AspectDefinition(aspectClass,
+ advertisedProviders.build(),
requiredProviders.build(),
requiredAspectProviders.build(),
ImmutableMap.copyOf(attributes),