Make all WithLegacySkylarkName providers declared providers.
RELNOTES: None.
PiperOrigin-RevId: 163343931
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
index 966471c..a5ad97e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.analysis;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
@@ -100,15 +99,19 @@
*/
public static <S extends TransitiveInfoCollection, C extends TransitiveInfoProvider> Iterable<S>
filterByProvider(Iterable<S> prerequisites, final Class<C> provider) {
- return Iterables.filter(prerequisites, new Predicate<S>() {
- @Override
- public boolean apply(S target) {
- return target.getProvider(provider) != null;
- }
- });
+ return Iterables.filter(prerequisites, target -> target.getProvider(provider) != null);
}
/**
+ * Returns the iterable of collections that have the specified provider.
+ */
+ public static <S extends TransitiveInfoCollection, C extends SkylarkClassObject> Iterable<S>
+ filterByProvider(Iterable<S> prerequisites, final NativeClassObjectConstructor<C> provider) {
+ return Iterables.filter(prerequisites, target -> target.get(provider) != null);
+ }
+
+
+ /**
* Returns the path of the associated manifest file for the path of a Fileset. Works for both
* exec paths and root relative paths.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 6bf2ee2..c4afb4f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -30,6 +30,7 @@
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.ClassObjectConstructor;
+import com.google.devtools.build.lib.packages.NativeClassObjectConstructor;
import com.google.devtools.build.lib.packages.SkylarkClassObject;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetUtils;
@@ -212,7 +213,6 @@
public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProvider(
TransitiveInfoProvider provider) {
providersBuilder.add(provider);
- maybeAddSkylarkProvider(provider);
return this;
}
@@ -220,9 +220,6 @@
public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProviders(
Iterable<TransitiveInfoProvider> providers) {
providersBuilder.addAll(providers);
- for (TransitiveInfoProvider provider : providers) {
- maybeAddSkylarkProvider(provider);
- }
return this;
}
@@ -250,14 +247,15 @@
Preconditions.checkNotNull(key);
Preconditions.checkNotNull(value);
providersBuilder.put(key, value);
- maybeAddSkylarkProvider(value);
return this;
}
- protected <T extends TransitiveInfoProvider> void maybeAddSkylarkProvider(T value) {
- if (value instanceof TransitiveInfoProvider.WithLegacySkylarkName) {
+ private <T extends TransitiveInfoProvider> void maybeAddSkylarkLegacyProvider(
+ SkylarkClassObject value) {
+ if (value.getConstructor() instanceof NativeClassObjectConstructor.WithLegacySkylarkName) {
addSkylarkTransitiveInfo(
- ((TransitiveInfoProvider.WithLegacySkylarkName) value).getSkylarkName(),
+ ((NativeClassObjectConstructor.WithLegacySkylarkName) value.getConstructor())
+ .getSkylarkName(),
value);
}
}
@@ -328,6 +326,7 @@
ClassObjectConstructor constructor = provider.getConstructor();
Preconditions.checkState(constructor.isExported());
providersBuilder.put(provider);
+ maybeAddSkylarkLegacyProvider(provider);
return this;
}
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 986a93b..80b2c4e 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
@@ -902,6 +902,17 @@
}
/**
+ * Returns all the providers of the specified type that are listed under the specified attribute
+ * of this target in the BUILD file, and that contain the specified provider.
+ */
+ public <C extends SkylarkClassObject>
+ Iterable<? extends TransitiveInfoCollection> getPrerequisitesIf(
+ String attributeName, Mode mode, final NativeClassObjectConstructor<C> classType) {
+ return AnalysisUtils.filterByProvider(getPrerequisites(attributeName, mode), classType);
+ }
+
+
+ /**
* Returns the prerequisite referred to by the specified attribute. Also checks whether
* the attribute is marked as executable and that the target referred to can actually be
* executed.
@@ -2094,7 +2105,7 @@
String missingProviders = getMissingMandatoryProviders(prerequisite, attribute);
if (missingProviders != null) {
unfulfilledRequirements.add(
- "'" + prerequisite.getLabel() + "' does not have mandatory provider "
+ "'" + prerequisite.getLabel() + "' does not have mandatory providers: "
+ missingProviders);
hadAllMandatoryProviders = false;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java
index 9ee8933..f2b4919 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java
@@ -61,18 +61,4 @@
*/
public interface TransitiveInfoProvider {
- /**
- * Implement this to mark that a native provider should be exported with
- * certain name to Skylark.
- * Broken: only works for rules, not for aspects.
- * DO NOT USE FOR NEW CODE!
- *
- * Use native declared providers
- * ({@link com.google.devtools.build.lib.packages.NativeClassObjectConstructor}) to
- * expose providers to both native and Skylark code.
- */
- @Deprecated
- interface WithLegacySkylarkName {
- String getSkylarkName();
- }
}