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);
}