Add attribute validation of mandatory native providers
and use it to validate that :java_toolchain has a JavaToolchainProvider.
--
MOS_MIGRATED_REVID=121396726
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 faa4f2c..961158c 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
@@ -1710,6 +1710,32 @@
return missingProviders.toString();
}
+ private String getMissingMandatoryNativeProviders(
+ ConfiguredTarget prerequisite, Attribute attribute) {
+ List<Class<? extends TransitiveInfoProvider>> mandatoryProvidersList =
+ attribute.getMandatoryNativeProviders();
+ if (mandatoryProvidersList.isEmpty()) {
+ return null;
+ }
+ List<Class<? extends TransitiveInfoProvider>> missing = new ArrayList<>();
+ for (Class<? extends TransitiveInfoProvider> provider : mandatoryProvidersList) {
+ if (prerequisite.getProvider(provider) == null) {
+ missing.add(provider);
+ }
+ }
+ if (missing.isEmpty()) {
+ return null;
+ }
+ StringBuilder sb = new StringBuilder();
+ for (Class<? extends TransitiveInfoProvider> provider : missing) {
+ if (sb.length() > 0) {
+ sb.append(", ");
+ }
+ sb.append(provider.getSimpleName());
+ }
+ return sb.toString();
+ }
+
/**
* Because some rules still have to use allowedRuleClasses to do rule dependency validation.
* We implemented the allowedRuleClasses OR mandatoryProvidersList mechanism. Either condition
@@ -1739,6 +1765,16 @@
}
}
+ if (!attribute.getMandatoryNativeProviders().isEmpty()) {
+ String missing = getMissingMandatoryNativeProviders(prerequisite, attribute);
+ if (missing != null) {
+ attributeError(
+ attribute.getName(),
+ "'" + prerequisite.getLabel() + "' does not have mandatory providers: " + missing);
+ return;
+ }
+ }
+
if (!attribute.getMandatoryProvidersList().isEmpty()) {
String missingMandatoryProviders = getMissingMandatoryProviders(prerequisite, attribute);
if (missingMandatoryProviders != null) {