Use RequiredProviders to validate rule prerequisites in RuleContext.
We now use a unified way to check provider requirements everywhere.
Reland of https://github.com/bazelbuild/bazel/commit/c32e1b1efcd703b3780de47fba62974123593d71.
RELNOTES: None.
PiperOrigin-RevId: 164038621
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
index b174a47..b3b4894 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
@@ -16,6 +16,7 @@
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.RequiredProviders;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.syntax.SkylarkIndexable;
@@ -79,4 +80,25 @@
* <b>null</b>.</p>
*/
@Nullable BuildConfiguration getConfiguration();
+
+ /**
+ * Checks whether this {@link TransitiveInfoCollection} satisfies given {@link RequiredProviders}.
+ */
+ default boolean satisfies(RequiredProviders providers) {
+ return providers.isSatisfiedBy(
+ aClass -> getProvider(aClass.asSubclass(TransitiveInfoProvider.class)) != null,
+ id -> this.get(id) != null);
+ }
+
+ /**
+ * Returns providers that this {@link TransitiveInfoCollection} misses from a given {@link
+ * RequiredProviders}.
+ *
+ * <p>If none are missing, returns {@link RequiredProviders} that accept any set of providers.
+ */
+ default RequiredProviders missingProviders(RequiredProviders providers) {
+ return providers.getMissing(
+ aClass -> getProvider(aClass.asSubclass(TransitiveInfoProvider.class)) != null,
+ id -> this.get(id) != null);
+ }
}