Make native declared providers not implement TransitiveInfoCollection.

(Almost) all native declared providers are accessed as such and not as
native non-declared providers (inheritors of TransitiveInfoCollaction).

There are still three providers that use
TransitiveInfoCollection.WithLegacySkylarkName mechanism, I'll address
them in the follow-up CL.

RELNOTES: None.
PiperOrigin-RevId: 161655315
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index a27427a..8987fed 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -60,7 +60,6 @@
 import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.BuildType;
-import com.google.devtools.build.lib.packages.ClassObjectConstructor;
 import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy;
 import com.google.devtools.build.lib.packages.FileTarget;
 import com.google.devtools.build.lib.packages.FilesetEntry;
@@ -820,6 +819,28 @@
   }
 
   /**
+   * For a given attribute, returns all declared provider provided by targets
+   * of that attribute. Each declared provider is keyed by the
+   * {@link BuildConfiguration} under which the provider was created.
+   */
+  public <C extends SkylarkClassObject> ImmutableListMultimap<BuildConfiguration, C>
+  getPrerequisitesByConfiguration(String attributeName, Mode mode,
+      final NativeClassObjectConstructor<C> provider) {
+    List<? extends TransitiveInfoCollection> transitiveInfoCollections =
+        getPrerequisites(attributeName, mode);
+
+    ImmutableListMultimap.Builder<BuildConfiguration, C> result =
+        ImmutableListMultimap.builder();
+    for (TransitiveInfoCollection prerequisite : transitiveInfoCollections) {
+      C prerequisiteProvider = prerequisite.get(provider);
+      if (prerequisiteProvider != null) {
+        result.put(prerequisite.getConfiguration(), prerequisiteProvider);
+      }
+    }
+    return result.build();
+  }
+
+  /**
    * For a given attribute, returns all {@link TransitiveInfoCollection}s provided by targets
    * of that attribute. Each {@link TransitiveInfoCollection} is keyed by the
    * {@link BuildConfiguration} under which the collection was created.
@@ -862,8 +883,8 @@
    * TransitiveInfoCollection under the specified attribute.
    */
   @Nullable
-  public SkylarkClassObject getPrerequisite(
-      String attributeName, Mode mode, final ClassObjectConstructor.Key skylarkKey) {
+  public <T extends SkylarkClassObject> T getPrerequisite(
+      String attributeName, Mode mode, final NativeClassObjectConstructor<T> skylarkKey) {
     TransitiveInfoCollection prerequisite = getPrerequisite(attributeName, mode);
     return prerequisite == null ? null : prerequisite.get(skylarkKey);
   }