Prefer RuleContext.getFragment over BuildConfiguration.getFragment.

This improves the coverage of the legality check in RuleContext.getFragment.

--
MOS_MIGRATED_REVID=101208822
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
index ebf472d..9432147 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
@@ -157,7 +157,6 @@
     Preconditions.checkNotNull(executable);
     Preconditions.checkNotNull(javaStartClass);
     Preconditions.checkNotNull(javaExecutable);
-    BuildConfiguration config = ruleContext.getConfiguration();
 
     List<Substitution> arguments = new ArrayList<>();
     String workspacePrefix = ruleContext.getWorkspaceName();
@@ -167,7 +166,7 @@
     arguments.add(Substitution.of("%workspace_prefix%", workspacePrefix));
     arguments.add(Substitution.of("%javabin%", javaExecutable));
     arguments.add(Substitution.of("%needs_runfiles%",
-        config.getFragment(Jvm.class).getJavaExecutable().isAbsolute() ? "0" : "1"));
+        ruleContext.getFragment(Jvm.class).getJavaExecutable().isAbsolute() ? "0" : "1"));
     arguments.add(new ComputedSubstitution("%classpath%") {
       @Override
       public String getValue() {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java
index 40c254e..4b7c7c4 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java
@@ -23,6 +23,8 @@
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
+import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration;
+import com.google.devtools.build.lib.rules.objc.ObjcConfiguration;
 import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses;
 import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport;
 import com.google.devtools.build.lib.rules.objc.XcodeSupport;
@@ -34,6 +36,7 @@
   @Override
   public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) {
     return builder
+        .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class)
         /*<!-- #BLAZE_RULE(ios_test).IMPLICIT_OUTPUTS -->
         <ul>
           <li><code><var>name</var>.ipa</code>: the test bundle as an
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 655edad..65688bd 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -825,6 +825,10 @@
       this((Label) null);
     }
 
+    public LateBoundLabel(Class<?>... requiredConfigurationFragments) {
+      this((Label) null, requiredConfigurationFragments);
+    }
+
     public LateBoundLabel(Label label) {
       this.label = label;
       this.requiredConfigurationFragments = ImmutableSet.of();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index e0e4c7f..81f3af5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -773,7 +773,6 @@
 
   static boolean shouldDexWithJack(RuleContext ruleContext) {
     return ruleContext
-        .getConfiguration()
         .getFragment(AndroidConfiguration.class)
         .isJackUsedForDexing();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index fa24bbb..7928a1b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -153,7 +153,7 @@
    * Implementation for the :proguard attribute.
    */
   static final LateBoundLabel<BuildConfiguration> PROGUARD =
-      new LateBoundLabel<BuildConfiguration>() {
+      new LateBoundLabel<BuildConfiguration>(AndroidConfiguration.class) {
     @Override
     public Label getDefault(Rule rule, BuildConfiguration configuration) {
       // If --proguard_top is not specified, null is returned. AndroidSdk will take care of using
@@ -163,7 +163,7 @@
   };
 
   public static final LateBoundLabel<BuildConfiguration> ANDROID_SDK =
-      new LateBoundLabel<BuildConfiguration>(DEFAULT_ANDROID_SDK) {
+      new LateBoundLabel<BuildConfiguration>(DEFAULT_ANDROID_SDK, AndroidConfiguration.class) {
         @Override
         public Label getDefault(Rule rule, BuildConfiguration configuration) {
           return configuration.getFragment(AndroidConfiguration.class).getSdk();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
index de9c089..3c6964a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
@@ -784,7 +784,6 @@
 
       boolean useSanityChecks =
           ruleContext
-              .getConfiguration()
               .getFragment(AndroidConfiguration.class)
               .isJackSanityChecked();
       FilesToRunProvider jackBinary = androidSdk.getJack();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 69b79ed..0f644f3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -530,8 +530,7 @@
     requestedFeatures.addAll(ruleSpecificRequestedFeatures);
 
     // Enable FDO related features requested by options.
-    CppConfiguration cppConfiguration =
-        ruleContext.getConfiguration().getFragment(CppConfiguration.class);
+    CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
     FdoSupport fdoSupport = cppConfiguration.getFdoSupport();
     if (fdoSupport.getFdoInstrument() != null) {
       requestedFeatures.add(CppRuleClasses.FDO_INSTRUMENT);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
index c1674a9..1ab0316 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
@@ -36,7 +36,7 @@
  */
 public final class CcToolchainRule implements RuleDefinition {
   private static final LateBoundLabel<BuildConfiguration> LIBC_LINK =
-      new LateBoundLabel<BuildConfiguration>() {
+      new LateBoundLabel<BuildConfiguration>(CppConfiguration.class) {
         @Override
         public Label getDefault(Rule rule, BuildConfiguration configuration) {
           return configuration.getFragment(CppConfiguration.class).getLibcLabel();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
index 2f12d4a..9ffaba5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
@@ -80,10 +80,10 @@
   private FeatureConfiguration featureConfiguration;
 
   public CppModel(RuleContext ruleContext, CppSemantics semantics) {
-    this.ruleContext = ruleContext;
+    this.ruleContext = Preconditions.checkNotNull(ruleContext);
     this.semantics = semantics;
     configuration = ruleContext.getConfiguration();
-    cppConfiguration = configuration.getFragment(CppConfiguration.class);
+    cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
index b9a4fb9..a64a892 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
@@ -1047,7 +1047,7 @@
         featureConfiguration = CcCommon.configureFeatures(ruleContext);
         CcToolchainFeatures.Variables.Builder buildVariables =
             new CcToolchainFeatures.Variables.Builder();
-        CppConfiguration cppConfiguration = configuration.getFragment(CppConfiguration.class);
+        CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
         cppConfiguration.getFdoSupport().getLinkOptions(featureConfiguration, buildVariables);
         variables = buildVariables.build();
       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
index b582bd9..010e3b9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
@@ -83,7 +83,7 @@
   static final String JAVA_TOOLCHAIN_LABEL = "//tools/defaults:java_toolchain";
 
   public static final LateBoundLabel<BuildConfiguration> JAVA_TOOLCHAIN =
-      new LateBoundLabel<BuildConfiguration>(JAVA_TOOLCHAIN_LABEL) {
+      new LateBoundLabel<BuildConfiguration>(JAVA_TOOLCHAIN_LABEL, JavaConfiguration.class) {
         @Override
         public Label getDefault(Rule rule, BuildConfiguration configuration) {
           return configuration.getFragment(JavaConfiguration.class).getToolchainLabel();
@@ -146,7 +146,7 @@
    * Implementation for the :jvm attribute.
    */
   public static final LateBoundLabel<BuildConfiguration> JVM =
-      new LateBoundLabel<BuildConfiguration>(JDK_LABEL) {
+      new LateBoundLabel<BuildConfiguration>(JDK_LABEL, Jvm.class) {
         @Override
         public Label getDefault(Rule rule, BuildConfiguration configuration) {
           return configuration.getFragment(Jvm.class).getJvmLabel();
@@ -157,7 +157,7 @@
    * Implementation for the :host_jdk attribute.
    */
   public static final LateBoundLabel<BuildConfiguration> HOST_JDK =
-      new LateBoundLabel<BuildConfiguration>(JDK_LABEL) {
+      new LateBoundLabel<BuildConfiguration>(JDK_LABEL, Jvm.class) {
         @Override
         public boolean useHostConfiguration() {
           return true;
@@ -174,7 +174,7 @@
    * default, so it returns null for the configuration-independent default value.
    */
   public static final LateBoundLabel<BuildConfiguration> JAVA_LAUNCHER =
-      new LateBoundLabel<BuildConfiguration>() {
+      new LateBoundLabel<BuildConfiguration>(JavaConfiguration.class) {
         @Override
         public Label getDefault(Rule rule, BuildConfiguration configuration) {
           return configuration.getFragment(JavaConfiguration.class).getJavaLauncherLabel();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java
index af8f8b0..f331aba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder;
+import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration;
 
 /**
  * Rule definition for ios_framework_binary.
@@ -28,6 +29,7 @@
   @Override
   public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
     return builder
+        .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class)
         /*<!-- #BLAZE_RULE(ios_framework_binary).IMPLICIT_OUTPUTS -->
         <ul>
          <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java
index 766b86c..838c113 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkRule.java
@@ -33,6 +33,7 @@
   @Override
   public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
     return builder
+        .requiresConfigurationFragments(ObjcConfiguration.class)
         // TODO(blaze-team): IPA is not right here, should probably be just zipped framework bundle.
         .setImplicitOutputsFunction(
             ImplicitOutputsFunction.fromFunctions(ReleaseBundlingSupport.IPA, XcodeSupport.PBXPROJ))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
index ce1709a..4c404d8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
@@ -163,7 +163,7 @@
     boolean libPerProtoIncludes =
          ruleContext.attributes().get(
              ObjcProtoLibraryRule.PER_PROTO_INCLUDES, Type.BOOLEAN);
-    if (ruleContext.getConfiguration().getFragment(ObjcConfiguration.class).perProtoIncludes()
+    if (ruleContext.getFragment(ObjcConfiguration.class).perProtoIncludes()
         || libPerProtoIncludes) {
       searchPathEntriesBuilder
           .add(generatedProtoDir)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
index ec3f279..60e4d29 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
@@ -712,7 +712,7 @@
           .add(attr(":dumpsyms", LABEL)
           .cfg(HOST)
           .singleArtifact()
-          .value(new LateBoundLabel<BuildConfiguration>() {
+          .value(new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) {
             @Override
             public Label getDefault(Rule rule, BuildConfiguration configuration) {
               if (!configuration.getFragment(ObjcConfiguration.class).generateDebugSymbols()) {
@@ -892,7 +892,7 @@
           .add(attr(":default_provisioning_profile", LABEL)
               .singleArtifact()
               .allowedFileTypes(FileType.of(".mobileprovision"))
-              .value(new LateBoundLabel<BuildConfiguration>() {
+              .value(new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) {
                 @Override
                 public Label getDefault(Rule rule, BuildConfiguration configuration) {
                   ObjcConfiguration objcConfiguration =