aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
diff options
context:
space:
mode:
authorGravatar dslomov <dslomov@google.com>2017-07-12 14:59:07 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-07-12 16:03:11 +0200
commit4e9fa1947c838882befd94f95233275e68be82f1 (patch)
tree93cf377d0e0f8dcd18e77bf74dd215c9cd445adf /src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
parent425f2496d65d1e190f633236575009e49e1252b3 (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.java27
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);
}