SplitTransitionProvider no longer requires the attributes it uses are "Non Configurable"

RELNOTES: None.
PiperOrigin-RevId: 171751391
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
index 33c7531..d406511 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
@@ -371,8 +371,7 @@
 
       LateBoundDefault<?, ?> lateBoundDefault = attribute.getLateBoundDefault();
 
-      Collection<BuildOptions> splitOptions =
-          getSplitOptions(depResolver.rule, attribute, ruleConfig);
+      Collection<BuildOptions> splitOptions = getSplitOptions(attributeMap, attribute, ruleConfig);
       if (!splitOptions.isEmpty() && !ruleConfig.isHostConfiguration()) {
         // Late-bound attribute with a split transition:
         // Since we want to get the same results as TransitionResolver.evaluateTransition (but
@@ -425,14 +424,15 @@
    * <p>Even though the attribute may have a split, splits don't have to apply in every
    * configuration (see {@link Attribute.SplitTransition#split}).
    */
-  private static Collection<BuildOptions> getSplitOptions(Rule rule, Attribute attribute,
+  private static Collection<BuildOptions> getSplitOptions(ConfiguredAttributeMapper attributeMap,
+      Attribute attribute,
       BuildConfiguration ruleConfig) {
     if (!attribute.hasSplitConfigurationTransition()) {
       return ImmutableList.<BuildOptions>of();
     }
     @SuppressWarnings("unchecked") // Attribute.java doesn't have the BuildOptions symbol.
     Attribute.SplitTransition<BuildOptions> transition =
-        (Attribute.SplitTransition<BuildOptions>) attribute.getSplitTransition(rule);
+        (Attribute.SplitTransition<BuildOptions>) attribute.getSplitTransition(attributeMap);
     return transition.split(ruleConfig.getOptions());
   }
 
@@ -716,7 +716,7 @@
         return; // Skip this round: we still need to Skyframe-evaluate the dep's target.
       }
       Attribute.Transition transition = transitionResolver.evaluateTransition(
-          ruleConfig, rule, attributeAndOwner.attribute, toTarget);
+          ruleConfig, rule, attributeAndOwner.attribute, toTarget, attributeMap);
       outgoingEdges.put(
           attributeAndOwner.attribute,
           transition == Attribute.ConfigurationTransition.NULL
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 55e1f20..f94ac86 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
@@ -251,7 +251,7 @@
   public Root getMiddlemanDirectory() {
     return getConfiguration().getMiddlemanDirectory(rule.getRepository());
   }
-  
+
   public Rule getRule() {
     return rule;
   }
@@ -748,7 +748,8 @@
     Attribute attributeDefinition = attributes().getAttributeDefinition(attributeName);
     @SuppressWarnings("unchecked") // Attribute.java doesn't have the BuildOptions symbol.
     SplitTransition<BuildOptions> transition =
-        (SplitTransition<BuildOptions>) attributeDefinition.getSplitTransition(rule);
+        (SplitTransition<BuildOptions>) attributeDefinition.getSplitTransition(
+            ConfiguredAttributeMapper.of(rule, configConditions));
     List<ConfiguredTarget> deps = targetMap.get(attributeName);
 
     List<BuildOptions> splitOptions = transition.split(getConfiguration().getOptions());
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
index ebcefb6..289f445 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
 import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
 import com.google.devtools.build.lib.packages.Attribute.Transition;
+import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper;
 import com.google.devtools.build.lib.packages.InputFile;
 import com.google.devtools.build.lib.packages.PackageGroup;
 import com.google.devtools.build.lib.packages.Rule;
@@ -63,7 +64,7 @@
    *     {@link Attribute.ConfigurationTransition}).
    */
   public Transition evaluateTransition(BuildConfiguration fromConfig, final Rule fromRule,
-      final Attribute attribute, final Target toTarget) {
+      final Attribute attribute, final Target toTarget, ConfiguredAttributeMapper attributeMap) {
 
     // I. Input files and package groups have no configurations. We don't want to duplicate them.
     if (usesNullConfiguration(toTarget)) {
@@ -112,7 +113,7 @@
     // The "else" is a legacy restriction from static configurations.
     if (attribute.hasSplitConfigurationTransition()) {
       currentTransition = split(currentTransition,
-          (SplitTransition<BuildOptions>) attribute.getSplitTransition(fromRule));
+          (SplitTransition<BuildOptions>) attribute.getSplitTransition(attributeMap));
     } else {
       // III. Attributes determine configurations. The configuration of a prerequisite is determined
       // by the attribute.
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 2fedb6a..1f8313c 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
@@ -188,7 +188,8 @@
 
     /**
      * Transition to one or more configurations. To obtain the actual child configurations,
-     * invoke {@link Attribute#getSplitTransition(Rule)}. See {@link SplitTransition}.
+     * invoke {@link Attribute#getSplitTransition(ConfiguredAttributeMapper)}.
+     * See {@link SplitTransition}.
      **/
     SPLIT
   }
@@ -317,9 +318,9 @@
    */
   public interface SplitTransitionProvider {
     /**
-     * Returns the {@link SplitTransition} given the originating rule.
+     * Returns the {@link SplitTransition} given the attribute mapper of the originating rule.
      */
-    SplitTransition<?> apply(Rule fromRule);
+    SplitTransition<?> apply(ConfiguredAttributeMapper attributeMap);
   }
 
   /**
@@ -335,7 +336,7 @@
     }
 
     @Override
-    public SplitTransition<?> apply(Rule fromRule) {
+    public SplitTransition<?> apply(ConfiguredAttributeMapper attributeMap) {
       return splitTransition;
     }
   }
@@ -1954,13 +1955,13 @@
   /**
    * Returns the split configuration transition for this attribute.
    *
-   * @param rule the originating {@link Rule} which owns this attribute
+   * @param attributeMapper the attribute mapper of the current {@link Rule}
    * @return a SplitTransition<BuildOptions> object
    * @throws IllegalStateException if {@link #hasSplitConfigurationTransition} is not true
    */
-  public SplitTransition<?> getSplitTransition(Rule rule) {
+  public SplitTransition<?> getSplitTransition(ConfiguredAttributeMapper attributeMapper) {
     Preconditions.checkState(hasSplitConfigurationTransition());
-    return splitTransitionProvider.apply(rule);
+    return splitTransitionProvider.apply(attributeMapper);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
index 6089544..cc80e1b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
@@ -26,8 +26,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
 import com.google.devtools.build.lib.packages.Attribute.SplitTransitionProvider;
-import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
-import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
@@ -124,8 +123,7 @@
   }
 
   @Override
-  public SplitTransition<?> apply(Rule fromRule) {
-    NonconfigurableAttributeMapper attrMapper = NonconfigurableAttributeMapper.of(fromRule);
+  public SplitTransition<?> apply(ConfiguredAttributeMapper attrMapper) {
     String platformTypeString = attrMapper.get(PlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING);
     String minimumOsVersionString = attrMapper.get(PlatformRule.MINIMUM_OS_VERSION, STRING);
     PlatformType platformType;
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 f18c11f..9278b01 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
@@ -909,16 +909,14 @@
           <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
           .add(
               attr(PLATFORM_TYPE_ATTR_NAME, STRING)
-                  .mandatory()
-                  .nonconfigurable("Determines the configuration transition on deps"))
+                  .mandatory())
           /* <!-- #BLAZE_RULE($apple_platform_rule).ATTRIBUTE(minimum_os_version) -->
           The minimum OS version that this target and its dependencies should be built for.
 
           This should be a dotted version string such as "7.3".
           <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
           .add(
-              attr(MINIMUM_OS_VERSION, STRING)
-                  .nonconfigurable("Determines the configuration transition on deps"))
+              attr(MINIMUM_OS_VERSION, STRING))
           .build();
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
index 70ffa8f..6d259f4 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
@@ -301,7 +301,7 @@
 
   private static class TestSplitTransitionProvider implements SplitTransitionProvider {
     @Override
-    public SplitTransition<?> apply(Rule fromRule) {
+    public SplitTransition<?> apply(ConfiguredAttributeMapper attrMapper) {
       return new TestSplitTransition();
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
index 698f334..33c5e26 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
@@ -1119,6 +1119,37 @@
         getGeneratingAction(arm64ProtoObjcSource).getInputs(), "two.proto")).isNotNull();
   }
 
+  @Test
+  public void testPlatformTypeIsConfigurable() throws Exception {
+    scratch.file(
+        "examples/BUILD",
+        "package(default_visibility = ['//visibility:public'])",
+        "apple_binary(",
+        "    name = 'bin',",
+        "    deps = [':objc_lib'],",
+        "    platform_type = select({",
+        "        ':watch_setting': 'watchos',",
+        "        '//conditions:default': 'ios',",
+        "    }),",
+        ")",
+        "objc_library(",
+        "    name = 'objc_lib',",
+        "    srcs = ['a.m'],",
+        ")",
+        "config_setting(",
+        "    name = 'watch_setting',",
+        "    values = {'define': 'use_watch=1'},",
+        ")");
+
+    useConfiguration("--define=use_watch=1",
+        "--ios_multi_cpus=armv7,arm64",
+        "--watchos_cpus=armv7k");
+
+    Action lipoAction = actionProducingArtifact("//examples:bin", "_lipobin");
+
+    assertThat(getSingleArchBinary(lipoAction, "armv7k")).isNotNull();
+  }
+
   private SkylarkDict<String, SkylarkDict<String, Artifact>>
       generateAppleDebugOutputsSkylarkProviderMap() throws Exception {
     scratch.file("examples/rule/BUILD");