Make aspects support SkylarkApiProviders.

These are initialised with a TransitiveInfoCollection, which aspects do not implement. By fiddling with the interfaces we can pull out a ProviderCollection which is sufficient for a SkylarkApiProvider to operate.

RELNOTES: None
PiperOrigin-RevId: 215441598
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
index a87bdde..5c01533 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
@@ -26,6 +26,7 @@
 import com.google.devtools.build.lib.actions.Actions.GeneratingActions;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
+import com.google.devtools.build.lib.analysis.skylark.SkylarkApiProvider;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -76,6 +77,14 @@
     this.actions = actions;
     this.generatingActionIndex = generatingActionIndex;
     this.providers = providers;
+
+    // Initialize every SkylarkApiProvider
+    for (int i = 0; i < providers.getProviderCount(); i++) {
+      Object obj = providers.getProviderInstanceAt(i);
+      if (obj instanceof SkylarkApiProvider) {
+        ((SkylarkApiProvider) obj).init(providers);
+      }
+    }
   }
 
   /**
@@ -125,14 +134,14 @@
   }
 
   public InfoInterface get(Provider.Key key) {
-    return providers.getProvider(key);
+    return providers.get(key);
   }
 
   public Object get(String legacyKey) {
     if (OutputGroupInfo.SKYLARK_NAME.equals(legacyKey)) {
       return get(OutputGroupInfo.SKYLARK_CONSTRUCTOR.getKey());
     }
-    return providers.getProvider(legacyKey);
+    return providers.get(legacyKey);
   }
 
   public static ConfiguredAspect forAlias(ConfiguredAspect real) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/SkylarkProviderCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
similarity index 90%
rename from src/main/java/com/google/devtools/build/lib/analysis/SkylarkProviderCollection.java
rename to src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
index c30e12a..dced6a4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/SkylarkProviderCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
@@ -25,7 +25,13 @@
  * Interface to mark classes that could contain transitive information added using the Skylark
  * framework.
  */
-public interface SkylarkProviderCollection {
+public interface ProviderCollection {
+  /**
+   * Returns the transitive information provider requested, or null if the provider is not found.
+   * The provider has to be a TransitiveInfoProvider Java class.
+   */
+  @Nullable
+  <P extends TransitiveInfoProvider> P getProvider(Class<P> provider);
 
   /**
    * Returns the transitive information requested or null, if the information is not found. The
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
index 1ba59847..75f253c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
@@ -45,7 +45,7 @@
  * @see TransitiveInfoProvider
  */
 public interface TransitiveInfoCollection
-    extends SkylarkIndexable, SkylarkProviderCollection, TransitiveInfoCollectionApi {
+    extends SkylarkIndexable, ProviderCollection, TransitiveInfoCollectionApi {
 
   @Override
   default SkylarkNestedSet outputGroup(String group) {
@@ -57,12 +57,6 @@
   }
 
   /**
-   * Returns the transitive information provider requested, or null if the provider is not found.
-   * The provider has to be a TransitiveInfoProvider Java class.
-   */
-  @Nullable <P extends TransitiveInfoProvider> P getProvider(Class<P> provider);
-
-  /**
    * Returns the label associated with this prerequisite.
    */
   Label getLabel();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
index 29923da..91b3249 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
@@ -16,8 +16,6 @@
 
 import com.google.devtools.build.lib.packages.InfoInterface;
 import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
-import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 
 /**
@@ -37,37 +35,7 @@
  * </ul>
  */
 @Immutable
-public interface TransitiveInfoProviderMap {
-  /** Returns the instance for the provided providerClass, or {@code null}  if not present. */
-  @Nullable
-  <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass);
-
-  /**
-   * Returns the instance of declared provider with the given {@code key}, or {@code null} if not
-   * present.
-   */
-  @Nullable
-  InfoInterface getProvider(Provider.Key key);
-
-  /**
-   * Returns the instance of a legacy Skylark  with the given name, or {@code null} if not present.
-   *
-   * todo(dslomov,skylark): remove this as part of legacy provider removal.
-   */
-  @Nullable
-  Object getProvider(String legacyKey);
-
-  /**
-   * Helper method to access SKylark provider with a give {@code id} and validate its type.
-   */
-  @Nullable
-  default <T> T getProvider(
-      SkylarkProviderIdentifier id, Class<T> result) {
-    return result.cast(
-        id.isLegacy() ? this.getProvider(id.getLegacyId()) : this.getProvider(id.getKey())
-    );
-  }
-
+public interface TransitiveInfoProviderMap extends ProviderCollection {
   /**
    * Returns a count of providers.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
index 4ae87bf..1b5aa39 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
@@ -62,14 +62,14 @@
 
   @Nullable
   @Override
-  public InfoInterface getProvider(Provider.Key key) {
-    return (InfoInterface) get(key);
+  public InfoInterface get(Provider.Key key) {
+    return (InfoInterface) super.get(key);
   }
 
   @Nullable
   @Override
-  public Object getProvider(String legacyKey) {
-    return get(legacyKey);
+  public Object get(String legacyKey) {
+    return super.get(legacyKey);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
index dc96f65..1082572 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
@@ -87,11 +87,11 @@
 
   @Override
   protected InfoInterface rawGetSkylarkProvider(Provider.Key providerKey) {
-    return providers.getProvider(providerKey);
+    return providers.get(providerKey);
   }
 
   @Override
   protected Object rawGetSkylarkProvider(String providerKey) {
-    return providers.getProvider(providerKey);
+    return providers.get(providerKey);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
index 5a421df..2924efa 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
@@ -92,7 +92,7 @@
 
   @Override
   protected InfoInterface rawGetSkylarkProvider(Provider.Key providerKey) {
-    InfoInterface provider = providers.getProvider(providerKey);
+    InfoInterface provider = providers.get(providerKey);
     if (provider == null) {
       provider = base.get(providerKey);
     }
@@ -111,7 +111,7 @@
       }
       return actions.build();
     }
-    Object provider = providers.getProvider(providerKey);
+    Object provider = providers.get(providerKey);
     if (provider == null) {
       provider = base.get(providerKey);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
index 2314b43..d5c5a17 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
@@ -212,7 +212,7 @@
 
   @Override
   protected InfoInterface rawGetSkylarkProvider(Provider.Key providerKey) {
-    return providers.getProvider(providerKey);
+    return providers.get(providerKey);
   }
 
   @Override
@@ -220,7 +220,7 @@
     if (providerKey.equals(ACTIONS_FIELD_NAME)) {
       return actions;
     }
-    return providers.getProvider(providerKey);
+    return providers.get(providerKey);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
index 5c7362f..3c2a22c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
@@ -36,7 +36,7 @@
     srcs = UTIL_SRCS,
     deps = [
         ":platform",
-        "//src/main/java/com/google/devtools/build/lib:skylark-provider-collection",
+        "//src/main/java/com/google/devtools/build/lib:provider-collection",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformProviderUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformProviderUtils.java
index e2c39cc..f38d62c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformProviderUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformProviderUtils.java
@@ -15,46 +15,45 @@
 package com.google.devtools.build.lib.analysis.platform;
 
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.analysis.SkylarkProviderCollection;
+import com.google.devtools.build.lib.analysis.ProviderCollection;
 
 /** Utility methods to help locate platform-related providers. */
 public class PlatformProviderUtils {
 
   /** Retrieves and casts the {@link PlatformInfo} provider from the given target. */
-  public static PlatformInfo platform(SkylarkProviderCollection target) {
+  public static PlatformInfo platform(ProviderCollection target) {
     return target.get(PlatformInfo.PROVIDER);
   }
 
   /** Retrieves and casts {@link PlatformInfo} providers from the given targets. */
-  public static Iterable<PlatformInfo> platforms(
-      Iterable<? extends SkylarkProviderCollection> targets) {
+  public static Iterable<PlatformInfo> platforms(Iterable<? extends ProviderCollection> targets) {
     return Iterables.transform(targets, PlatformProviderUtils::platform);
   }
 
   /** Retrieves and casts the {@link ConstraintSettingInfo} provider from the given target. */
-  public static ConstraintSettingInfo constraintSetting(SkylarkProviderCollection target) {
+  public static ConstraintSettingInfo constraintSetting(ProviderCollection target) {
     return target.get(ConstraintSettingInfo.PROVIDER);
   }
 
   /** Retrieves and casts {@link ConstraintSettingInfo} providers from the given targets. */
   public static Iterable<ConstraintSettingInfo> constraintSettings(
-      Iterable<? extends SkylarkProviderCollection> targets) {
+      Iterable<? extends ProviderCollection> targets) {
     return Iterables.transform(targets, PlatformProviderUtils::constraintSetting);
   }
 
   /** Retrieves and casts the {@link ConstraintValueInfo} provider from the given target. */
-  public static ConstraintValueInfo constraintValue(SkylarkProviderCollection target) {
+  public static ConstraintValueInfo constraintValue(ProviderCollection target) {
     return target.get(ConstraintValueInfo.PROVIDER);
   }
 
   /** Retrieves and casts {@link ConstraintValueInfo} providers from the given targets. */
   public static Iterable<ConstraintValueInfo> constraintValues(
-      Iterable<? extends SkylarkProviderCollection> targets) {
+      Iterable<? extends ProviderCollection> targets) {
     return Iterables.transform(targets, PlatformProviderUtils::constraintValue);
   }
 
   /** Retrieves and casts the {@link ToolchainInfo} provider from the given target. */
-  public static ToolchainInfo toolchain(SkylarkProviderCollection target) {
+  public static ToolchainInfo toolchain(ProviderCollection target) {
     return target.get(ToolchainInfo.PROVIDER);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
index d0f4017..d47aff9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
@@ -15,20 +15,20 @@
 package com.google.devtools.build.lib.analysis.skylark;
 
 import com.google.common.base.Preconditions;
-import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.ProviderCollection;
 
 /**
  * An abstract class for adding a Skylark API for the native providers. Derived classes should
  * declare functions to be used from Skylark.
  */
 public abstract class SkylarkApiProvider {
-  private TransitiveInfoCollection info;
+  private ProviderCollection info;
 
-  protected TransitiveInfoCollection getInfo() {
+  protected ProviderCollection getInfo() {
     return info;
   }
 
-  public final void init(TransitiveInfoCollection info) {
+  public final void init(ProviderCollection info) {
     if (this.info != null) {
       // todo(dslomov): nuke this weird initialization mechanism.