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) {