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),