diff options
author | 2017-07-12 14:59:07 +0200 | |
---|---|---|
committer | 2017-07-12 16:03:11 +0200 | |
commit | 4e9fa1947c838882befd94f95233275e68be82f1 (patch) | |
tree | 93cf377d0e0f8dcd18e77bf74dd215c9cd445adf /src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java | |
parent | 425f2496d65d1e190f633236575009e49e1252b3 (diff) |
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java | 27 |
1 files changed, 24 insertions, 3 deletions
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 a27427a9e0..8987fedbd8 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.ConfigurationTransition; 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 @@ public final class RuleContext extends TargetContext } /** + * 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 @@ public final class RuleContext extends TargetContext * 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); } |