Remove RuleClass.Configurator and obsolete LIPO_ON_DEMAND uses.

Dynamic configs use RuleTransitionFactory instead.

Part of the static config cleanup effort.

PiperOrigin-RevId: 165590679
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 7dcb00c..6f97280 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -60,7 +60,6 @@
 import com.google.devtools.build.lib.packages.InputFile;
 import com.google.devtools.build.lib.packages.PackageGroup;
 import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClassProvider;
 import com.google.devtools.build.lib.packages.RuleTransitionFactory;
 import com.google.devtools.build.lib.packages.Target;
@@ -1785,15 +1784,6 @@
         currentConfig.getTransitions().configurationHook(fromRule, attribute, toTarget, delegate);
         currentConfig = Iterables.getOnlyElement(delegate.toConfigurations);
 
-        // Allow rule classes to override their own configurations.
-        Rule associatedRule = toTarget.getAssociatedRule();
-        if (associatedRule != null) {
-          @SuppressWarnings("unchecked")
-          RuleClass.Configurator<BuildConfiguration, Rule> func =
-              associatedRule.getRuleClassObject().<BuildConfiguration, Rule>getConfigurator();
-          currentConfig = func.apply(associatedRule, currentConfig);
-        }
-
         toConfigs.add(currentConfig);
       }
       toConfigurations = toConfigs.build();
@@ -1953,22 +1943,6 @@
           }
         }
       }
-
-      /**
-       * Dynamic configurations don't support rule class configurators (which may need intermediate
-       * configurations to apply). The only current use of that is LIPO, which dynamic
-       * configurations have a different code path for:
-       * {@link com.google.devtools.build.lib.rules.cpp.CppRuleClasses.LIPO_ON_DEMAND}.
-       *
-       * So just check that if there is a configurator, it's for LIPO, in which case we can ignore
-       * it.
-       */
-      if (associatedRule != null) {
-        @SuppressWarnings("unchecked")
-        RuleClass.Configurator<?, ?> func =
-            associatedRule.getRuleClassObject().getConfigurator();
-        Verify.verify(func == RuleClass.NO_CHANGE || func.getCategory().equals("lipo"));
-      }
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcBinaryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcBinaryRule.java
index 26dbe4c..df577ad 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcBinaryRule.java
@@ -73,8 +73,7 @@
             attr("linkshared", BOOLEAN)
                 .value(false)
                 .nonconfigurable("used to *determine* the rule's configuration"))
-        .cfg(BazelCppRuleClasses.LIPO_ON_DEMAND) // static configuration version
-        .cfg(CppRuleClasses.LIPO_ON_DEMAND) // dynamic configuration version
+        .cfg(CppRuleClasses.LIPO_ON_DEMAND)
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
index 206e439..7df9e4e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
@@ -37,7 +37,6 @@
 import static com.google.devtools.build.lib.syntax.Type.STRING;
 import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Predicates;
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
@@ -72,29 +71,6 @@
   static final SafeImplicitOutputsFunction CC_BINARY_IMPLICIT_OUTPUTS =
       fromFunctions(CppRuleClasses.CC_BINARY_STRIPPED, CppRuleClasses.CC_BINARY_DEBUG_PACKAGE);
 
-  static final RuleClass.Configurator<BuildConfiguration, Rule> LIPO_ON_DEMAND =
-      new RuleClass.Configurator<BuildConfiguration, Rule>() {
-        @Override
-        public BuildConfiguration apply(Rule rule, BuildConfiguration configuration) {
-          Preconditions.checkState(!configuration.useDynamicConfigurations(),
-              "Dynamic configurations don't use rule class configurators for LIPO");
-          BuildConfiguration toplevelConfig =
-              configuration.getConfiguration(LipoTransition.TARGET_CONFIG_FOR_LIPO);
-          CppConfiguration cppConfig = configuration.getFragment(CppConfiguration.class);
-          if (toplevelConfig != null
-              && cppConfig.isDataConfigurationForLipoOptimization()
-              && rule.getLabel().equals(cppConfig.getLipoContextForBuild())) {
-            return toplevelConfig;
-          }
-          return configuration;
-        }
-
-        @Override
-        public String getCategory() {
-          return "lipo";
-        }
-      };
-
   public static final LateBoundLabel<BuildConfiguration> STL =
       new LateBoundLabel<BuildConfiguration>() {
         @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index efc9d3c..7cbb25f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -170,20 +170,6 @@
   }
 
   /**
-   * Using this callback function, rules can override their own configuration during the
-   * analysis phase.
-   */
-  public interface Configurator<TConfig, TRule> {
-    TConfig apply(TRule rule, TConfig configuration);
-
-    /**
-     * Describes the Bazel feature this configurator is used for. Used for checking that dynamic
-     * configuration transitions are only applied to expected configurator types.
-     */
-    String getCategory();
-  }
-
-  /**
    * A factory or builder class for rule implementations.
    */
   public interface ConfiguredTargetFactory<TConfiguredTarget, TContext> {
@@ -204,22 +190,6 @@
   }
 
   /**
-   * Default rule configurator, it doesn't change the assigned configuration.
-   */
-  public static final RuleClass.Configurator<Object, Object> NO_CHANGE =
-      new RuleClass.Configurator<Object, Object>() {
-        @Override
-        public Object apply(Object rule, Object configuration) {
-          return configuration;
-        }
-
-        @Override
-        public String getCategory() {
-          return "core";
-        }
-  };
-
-  /**
    * For Bazel's constraint system: the attribute that declares the set of environments a rule
    * supports, overriding the defaults for their respective groups.
    */
@@ -493,7 +463,6 @@
     private boolean outputsDefaultExecutable = false;
     private boolean isConfigMatcher = false;
     private ImplicitOutputsFunction implicitOutputsFunction = ImplicitOutputsFunction.NONE;
-    private Configurator<?, ?> configurator = NO_CHANGE;
     private RuleTransitionFactory transitionFactory;
     private RuleTransitionFactory outgoingTransitionFactory;
     private ConfiguredTargetFactory<?, ?> configuredTargetFactory = null;
@@ -614,7 +583,6 @@
           outputsDefaultExecutable,
           implicitOutputsFunction,
           isConfigMatcher,
-          configurator,
           transitionFactory,
           outgoingTransitionFactory,
           configuredTargetFactory,
@@ -749,16 +717,6 @@
       return this;
     }
 
-    public Builder cfg(Configurator<?, ?> configurator) {
-      Preconditions.checkState(type != RuleClassType.ABSTRACT,
-          "Setting not inherited property (cfg) of abstract rule class '%s'", name);
-      Preconditions.checkState(this.transitionFactory == null && this.configurator == NO_CHANGE,
-          "Property cfg has already been set");
-      Preconditions.checkNotNull(configurator);
-      this.configurator = configurator;
-      return this;
-    }
-
     /**
      * Applies the given transition to all incoming edges for this rule class.
      *
@@ -1093,12 +1051,6 @@
   private final ImplicitOutputsFunction implicitOutputsFunction;
 
   /**
-   * The set of implicit outputs generated by a rule, expressed as a function
-   * of that rule.
-   */
-  private final Configurator<?, ?> configurator;
-
-  /**
    * A factory which will produce a configuration transition that should be applied on any edge of
    * the configured target graph that leads into a target of this rule class.
    */
@@ -1198,7 +1150,6 @@
       boolean outputsDefaultExecutable,
       ImplicitOutputsFunction implicitOutputsFunction,
       boolean isConfigMatcher,
-      Configurator<?, ?> configurator,
       RuleTransitionFactory transitionFactory,
       RuleTransitionFactory outgoingRuleTransitionFactory,
       ConfiguredTargetFactory<?, ?> configuredTargetFactory,
@@ -1224,7 +1175,6 @@
     this.binaryOutput = binaryOutput;
     this.implicitOutputsFunction = implicitOutputsFunction;
     this.isConfigMatcher = isConfigMatcher;
-    this.configurator = Preconditions.checkNotNull(configurator);
     this.transitionFactory = transitionFactory;
     this.outgoingTransitionFactory = outgoingRuleTransitionFactory;
     this.configuredTargetFactory = configuredTargetFactory;
@@ -1293,11 +1243,6 @@
     return implicitOutputsFunction;
   }
 
-  @SuppressWarnings("unchecked")
-  public <C, R> Configurator<C, R> getConfigurator() {
-    return (Configurator<C, R>) configurator;
-  }
-
   public RuleTransitionFactory getTransitionFactory() {
     return transitionFactory;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 56dc190..d82c27b 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -48,7 +48,6 @@
 import com.google.devtools.build.lib.packages.Attribute.ValidityPredicate;
 import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.RuleClass.Configurator;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory;
 import com.google.devtools.build.lib.packages.RuleFactory.BuildLangTypedAttributeValuesMap;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
@@ -101,7 +100,6 @@
         false,
         false,
         ImplicitOutputsFunction.NONE,
-        RuleClass.NO_CHANGE,
         null,
         DUMMY_CONFIGURED_TARGET_FACTORY,
         PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -139,7 +137,6 @@
         false,
         false,
         ImplicitOutputsFunction.NONE,
-        RuleClass.NO_CHANGE,
         null,
         DUMMY_CONFIGURED_TARGET_FACTORY,
         PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -268,7 +265,6 @@
             false,
             false,
             ImplicitOutputsFunction.NONE,
-            RuleClass.NO_CHANGE,
             null,
             DUMMY_CONFIGURED_TARGET_FACTORY,
             PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -316,7 +312,6 @@
             false,
             false,
             ImplicitOutputsFunction.NONE,
-            RuleClass.NO_CHANGE,
             null,
             DUMMY_CONFIGURED_TARGET_FACTORY,
             PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -416,7 +411,6 @@
             false,
             ImplicitOutputsFunction.fromTemplates(
                 "foo-%{name}.bar", "lib%{name}-wazoo-%{name}.mumble", "stuff-%{outs}-bar"),
-            RuleClass.NO_CHANGE,
             null,
             DUMMY_CONFIGURED_TARGET_FACTORY,
             PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -458,7 +452,6 @@
             false,
             false,
             ImplicitOutputsFunction.fromTemplates("%{dirname}lib%{basename}.bar"),
-            RuleClass.NO_CHANGE,
             null,
             DUMMY_CONFIGURED_TARGET_FACTORY,
             PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -496,7 +489,6 @@
         false,
         false,
         ImplicitOutputsFunction.fromTemplates("empty"),
-        RuleClass.NO_CHANGE,
         null,
         DUMMY_CONFIGURED_TARGET_FACTORY,
         PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -659,7 +651,6 @@
             false,
             false,
             ImplicitOutputsFunction.fromTemplates("first-%{name}", "second-%{name}", "out-%{outs}"),
-            RuleClass.NO_CHANGE,
             null,
             DUMMY_CONFIGURED_TARGET_FACTORY,
             PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -703,7 +694,6 @@
             false,
             false,
             ImplicitOutputsFunction.NONE,
-            RuleClass.NO_CHANGE,
             null,
             DUMMY_CONFIGURED_TARGET_FACTORY,
             PredicatesWithMessage.<Rule>alwaysTrue(),
@@ -854,7 +844,6 @@
       boolean workspaceOnly,
       boolean outputsDefaultExecutable,
       ImplicitOutputsFunction implicitOutputsFunction,
-      Configurator<?, ?> configurator,
       RuleTransitionFactory transitionFactory,
       ConfiguredTargetFactory<?, ?> configuredTargetFactory,
       PredicateWithMessage<Rule> validityPredicate,
@@ -883,7 +872,6 @@
         outputsDefaultExecutable,
         implicitOutputsFunction,
         /*isConfigMatcher=*/ false,
-        configurator,
         transitionFactory,
         null,
         configuredTargetFactory,
@@ -914,7 +902,6 @@
         false,
         false,
         ImplicitOutputsFunction.NONE,
-        RuleClass.NO_CHANGE,
         null,
         DUMMY_CONFIGURED_TARGET_FACTORY,
         PredicatesWithMessage.<Rule>alwaysTrue(),