Remove support for late-bound split attributes.

RELNOTES: None.
PiperOrigin-RevId: 227691308
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 6062d06..330d145 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
@@ -23,14 +23,11 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
-import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
-import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.config.TransitionResolver;
 import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.NullTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
-import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.causes.Cause;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -95,8 +92,6 @@
    * @param aspect the aspect applied to this target (if any)
    * @param configConditions resolver for config_setting labels
    * @param toolchainLabels required toolchain labels
-   * @param defaultBuildOptions default build options provided to the server to use for creating
-   *     diffs during SkyKey construction
    * @param trimmingTransitionFactory the transition factory used to trim rules (note: this is a
    *     temporary feature; see the corresponding methods in ConfiguredRuleClassProvider)
    * @return a mapping of each attribute in this rule or aspects to its dependent nodes
@@ -107,10 +102,8 @@
       @Nullable Aspect aspect,
       ImmutableMap<Label, ConfigMatchingProvider> configConditions,
       ImmutableSet<Label> toolchainLabels,
-      BuildOptions defaultBuildOptions,
       @Nullable RuleTransitionFactory trimmingTransitionFactory)
-      throws EvalException, InvalidConfigurationException, InterruptedException,
-          InconsistentAspectOrderException {
+      throws EvalException, InterruptedException, InconsistentAspectOrderException {
     NestedSetBuilder<Cause> rootCauses = NestedSetBuilder.stableOrder();
     OrderedSetMultimap<Attribute, Dependency> outgoingEdges =
         dependentNodeMap(
@@ -120,7 +113,6 @@
             configConditions,
             toolchainLabels,
             rootCauses,
-            defaultBuildOptions,
             trimmingTransitionFactory);
     if (!rootCauses.isEmpty()) {
       throw new IllegalStateException(rootCauses.build().iterator().next().toString());
@@ -157,8 +149,6 @@
    * @param trimmingTransitionFactory the transition factory used to trim rules (note: this is a
    *     temporary feature; see the corresponding methods in ConfiguredRuleClassProvider)
    * @param rootCauses collector for dep labels that can't be (loading phase) loaded
-   * @param defaultBuildOptions default build options provided by the server to use for creating
-   *     diffs during SkyKey construction
    * @return a mapping of each attribute in this rule or aspects to its dependent nodes
    */
   public final OrderedSetMultimap<Attribute, Dependency> dependentNodeMap(
@@ -168,10 +158,8 @@
       ImmutableMap<Label, ConfigMatchingProvider> configConditions,
       ImmutableSet<Label> toolchainLabels,
       NestedSetBuilder<Cause> rootCauses,
-      BuildOptions defaultBuildOptions,
       @Nullable RuleTransitionFactory trimmingTransitionFactory)
-      throws EvalException, InvalidConfigurationException, InterruptedException,
-          InconsistentAspectOrderException {
+      throws EvalException, InterruptedException, InconsistentAspectOrderException {
     Target target = node.getTarget();
     BuildConfiguration config = node.getConfiguration();
     OrderedSetMultimap<Attribute, Dependency> outgoingEdges = OrderedSetMultimap.create();
@@ -193,7 +181,6 @@
           toolchainLabels,
           rootCauses,
           outgoingEdges,
-          defaultBuildOptions,
           trimmingTransitionFactory);
     } else if (target instanceof PackageGroup) {
       visitPackageGroup(node, (PackageGroup) target, rootCauses, outgoingEdges.get(null));
@@ -212,10 +199,8 @@
       ImmutableSet<Label> toolchainLabels,
       NestedSetBuilder<Cause> rootCauses,
       OrderedSetMultimap<Attribute, Dependency> outgoingEdges,
-      BuildOptions defaultBuildOptions,
       @Nullable RuleTransitionFactory trimmingTransitionFactory)
-      throws EvalException, InvalidConfigurationException, InconsistentAspectOrderException,
-          InterruptedException {
+      throws EvalException, InconsistentAspectOrderException, InterruptedException {
     Preconditions.checkArgument(node.getTarget() instanceof Rule, node);
     BuildConfiguration ruleConfig = Preconditions.checkNotNull(node.getConfiguration(), node);
     Rule rule = (Rule) node.getTarget();
@@ -234,7 +219,7 @@
 
     visitTargetVisibility(node, rootCauses, outgoingEdges.get(null));
     resolveEarlyBoundAttributes(depResolver);
-    resolveLateBoundAttributes(depResolver, ruleConfig, hostConfig, defaultBuildOptions);
+    resolveLateBoundAttributes(depResolver, ruleConfig, hostConfig);
 
     Attribute toolchainsAttribute =
         attributeMap.getAttributeDefinition(PlatformSemantics.RESOLVED_TOOLCHAINS_ATTR);
@@ -242,11 +227,11 @@
   }
 
   /**
-   * Resolves the dependencies for all attributes in this rule except late-bound attributes
-   * (which require special processing: see {@link #resolveLateBoundAttributes}).
+   * Resolves the dependencies for all attributes in this rule except late-bound attributes (which
+   * require special processing: see {@link #resolveLateBoundAttributes}).
    */
   private void resolveEarlyBoundAttributes(RuleResolver depResolver)
-      throws EvalException, InterruptedException, InconsistentAspectOrderException {
+      throws InterruptedException, InconsistentAspectOrderException {
     Rule rule = depResolver.rule;
 
     resolveExplicitAttributes(depResolver);
@@ -411,16 +396,10 @@
    * @param depResolver the resolver for this rule's deps
    * @param ruleConfig the rule's configuration
    * @param hostConfig the equivalent host configuration
-   * @param defaultBuildOptions default build options provided by the server to use for creating
-   *     diffs during SkyKey construction
    */
   private void resolveLateBoundAttributes(
-      RuleResolver depResolver,
-      BuildConfiguration ruleConfig,
-      BuildConfiguration hostConfig,
-      BuildOptions defaultBuildOptions)
-      throws EvalException, InvalidConfigurationException, InconsistentAspectOrderException,
-          InterruptedException {
+      RuleResolver depResolver, BuildConfiguration ruleConfig, BuildConfiguration hostConfig)
+      throws EvalException, InconsistentAspectOrderException, InterruptedException {
     ConfiguredAttributeMapper attributeMap = depResolver.attributeMap;
     Set<Label> labelsToFetch = new HashSet<>();
     Map<Label, Target> targetLookupResult = null;
@@ -432,66 +411,25 @@
         }
 
         LateBoundDefault<?, ?> lateBoundDefault = attribute.getLateBoundDefault();
+        // This is also verified as an assertion in ImmutableAttributeFactory#build() and signaled
+        // as a regular error instead of an assertion in SkylarkAttr#createAttribute() but better
+        // have two precondition checks than zero
+        Preconditions.checkState(!attribute.hasSplitConfigurationTransition());
 
-        boolean hasSplitTransition = false;
-        List<BuildOptions> splitOptions = null;
-        if (attribute.hasSplitConfigurationTransition()) {
-          splitOptions = attribute.getSplitTransition(attributeMap).split(ruleConfig.getOptions());
-          hasSplitTransition = !SplitTransition.equals(ruleConfig.getOptions(), splitOptions);
-        }
-
-        if (hasSplitTransition && !ruleConfig.isHostConfiguration()) {
-          // Late-bound attribute with a split transition:
-          // Since we want to get the same results as TransitionResolver.evaluateTransition (but
-          // skip it since we've already applied the split), we want to make sure this logic
-          // doesn't do anything differently. TransitionResolver.evaluateTransition has additional
-          // logic for host configs. So when we're in the host configuration we fall back to the
-          // non-split branch, which calls TransitionResolver.evaluateTransition, which returns its
-          // "host mode" result without ever looking at the split.
-          Iterable<BuildConfiguration> splitConfigs =
-              getConfigurations(ruleConfig.fragmentClasses(), splitOptions, defaultBuildOptions);
-          if (splitConfigs == null) {
-            Preconditions.checkState(collectingLabels, attributeAndOwner);
-            continue; // Need Skyframe deps.
-          }
-          for (BuildConfiguration splitConfig : splitConfigs) {
-            for (Label dep :
-                resolveLateBoundAttribute(
-                    depResolver.rule,
-                    attribute,
-                    lateBoundDefault.useHostConfiguration() ? hostConfig : splitConfig,
-                    attributeMap)) {
-              if (collectingLabels) {
-                labelsToFetch.add(dep);
-              } else {
-                // Skip the normal config transition pipeline and directly feed the split config.
-                // This is because the split already had to be applied to determine the attribute's
-                // value. This makes the split logic in the normal pipeline redundant and
-                // potentially incorrect.
-                Target target = targetLookupResult.get(dep);
-                if (target != null) {
-                  depResolver.registerEdge(attributeAndOwner, target, splitConfig);
-                }
-              }
-            }
-          }
+        List<Label> deps =
+            resolveLateBoundAttribute(
+                depResolver.rule,
+                attribute,
+                lateBoundDefault.useHostConfiguration() ? hostConfig : ruleConfig,
+                attributeMap);
+        if (collectingLabels) {
+          labelsToFetch.addAll(deps);
         } else {
-          List<Label> deps =
-              resolveLateBoundAttribute(
-                  depResolver.rule,
-                  attribute,
-                  lateBoundDefault.useHostConfiguration() ? hostConfig : ruleConfig,
-                  attributeMap);
-          if (collectingLabels) {
-            labelsToFetch.addAll(deps);
-          } else {
-            // Late-bound attribute without a split transition:
-            for (Label dep : deps) {
-              Target target = targetLookupResult.get(dep);
-              if (target != null) {
-                // Process this dep like a normal attribute.
-                depResolver.registerEdge(attributeAndOwner, target);
-              }
+          for (Label dep : deps) {
+            Target target = targetLookupResult.get(dep);
+            if (target != null) {
+              // Process this dep like a normal attribute.
+              depResolver.registerEdge(attributeAndOwner, target);
             }
           }
         }
@@ -847,28 +785,6 @@
                   toTarget.getLabel(), transition, requiredAspects(attributeAndOwner, toTarget)));
     }
 
-    /**
-     * Resolves the given dep for the given attribute using a pre-prepared configuration.
-     *
-     * <p>Use this method with care: it skips Bazel's standard config transition semantics ({@link
-     * TransitionResolver#evaluateTransition}). That means attributes passed through here won't obey
-     * standard rules on which configurations apply to their deps. This should only be done for
-     * special circumstances that really justify the difference. When in doubt, use {@link
-     * #registerEdge(AttributeAndOwner, Target)}.
-     */
-    void registerEdge(
-        AttributeAndOwner attributeAndOwner, Target toTarget, BuildConfiguration config)
-        throws InconsistentAspectOrderException {
-      outgoingEdges.put(
-          attributeAndOwner.attribute,
-          TransitionResolver.usesNullConfiguration(toTarget)
-              ? Dependency.withNullConfiguration(toTarget.getLabel())
-              : Dependency.withTransitionAndAspects(
-                  toTarget.getLabel(),
-                  new FixedTransition(config.getOptions()),
-                  requiredAspects(attributeAndOwner, toTarget)));
-    }
-
     private AspectCollection requiredAspects(AttributeAndOwner attributeAndOwner,
         final Target target) throws InconsistentAspectOrderException {
       if (!(target instanceof Rule)) {
@@ -981,24 +897,6 @@
       NestedSetBuilder<Cause> rootCauses,
       int labelsSizeHint)
       throws InterruptedException;
-  /**
-   * Returns the build configurations with the given fragments and {@link
-   * BuildOptions.OptionsDiffForReconstruction} resulting from calling {@link
-   * BuildOptions#diffForReconstruction} between the {@code defaultBuildOptions} and the provided
-   * {@code buildOptions}. Results will be returned in the order the {@code buildOptions} are
-   * provided.
-   *
-   * <p>Returns null if any configurations aren't ready to be returned at this moment. If
-   * getConfigurations returns null once or more during a {@link #dependentNodeMap} call, the
-   * results of that call will be incomplete. For use within Skyframe, where several iterations may
-   * be needed to discover all dependencies.
-   */
-  @Nullable
-  protected abstract List<BuildConfiguration> getConfigurations(
-      FragmentClassSet fragments,
-      Iterable<BuildOptions> buildOptions,
-      BuildOptions defaultBuildOptions)
-      throws InvalidConfigurationException, InterruptedException;
 
   /**
    * Signals an inconsistency on aspect path: an aspect occurs twice on the path and
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 0399edc..4d0d865 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
@@ -442,6 +442,7 @@
       Preconditions.checkState(!name.isEmpty(), "name has not been set");
       if (valueSource == AttributeValueSource.LATE_BOUND) {
         Preconditions.checkState(isLateBound(name));
+        Preconditions.checkState(splitTransitionProvider == null);
       }
       // TODO(bazel-team): Set the default to be no file type, then remove this check, and also
       // remove all allowedFileTypes() calls without parameters.
diff --git a/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java
index dda2be4..f321dc7 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java
@@ -13,14 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.lib.query2;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Streams;
-import com.google.devtools.build.lib.analysis.AspectCollection;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.Dependency;
 import com.google.devtools.build.lib.analysis.DependencyResolver;
@@ -31,8 +27,6 @@
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.BuildOptions.OptionsDiff;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
-import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
-import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
@@ -125,7 +119,6 @@
       OrderedSetMultimap<Attribute, Dependency> deps;
       ImmutableMap<Label, ConfigMatchingProvider> configConditions =
           ((RuleConfiguredTarget) configuredTarget).getConfigConditions();
-      BuildOptions fromOptions = config.getOptions();
       try {
         // Note: Being able to pull the $resolved_toolchain_internal attr unconditionally from the
         // mapper relies on the fact that {@link PlatformSemantics.RESOLVED_TOOLCHAINS_ATTR} exists
@@ -133,7 +126,7 @@
         // DependencyResolver but passing to avoid passing a null and since we have the information
         // anyway.
         deps =
-            new FormatterDependencyResolver(configuredTarget, eventHandler)
+            new FormatterDependencyResolver(eventHandler)
                 .dependentNodeMap(
                     new TargetAndConfiguration(target, config),
                     hostConfiguration,
@@ -142,9 +135,8 @@
                     ImmutableSet.copyOf(
                         ConfiguredAttributeMapper.of(target.getAssociatedRule(), configConditions)
                             .get(PlatformSemantics.RESOLVED_TOOLCHAINS_ATTR, BuildType.LABEL_LIST)),
-                    fromOptions,
                     trimmingTransitionFactory);
-      } catch (EvalException | InvalidConfigurationException | InconsistentAspectOrderException e) {
+      } catch (EvalException | InconsistentAspectOrderException e) {
         throw new InterruptedException(e.getMessage());
       }
       for (Map.Entry<Attribute, Dependency> attributeAndDep : deps.entries()) {
@@ -153,6 +145,7 @@
           continue;
         }
         Dependency dep = attributeAndDep.getValue();
+        BuildOptions fromOptions = config.getOptions();
         List<BuildOptions> toOptions = dep.getTransition().apply(fromOptions);
         String hostConfigurationChecksum = hostConfiguration.checksum();
         addResult(
@@ -203,20 +196,12 @@
   }
 
   private class FormatterDependencyResolver extends DependencyResolver {
-
-    private ConfiguredTarget ct;
     private final ExtendedEventHandler eventHandler;
 
-    private FormatterDependencyResolver(ConfiguredTarget ct, ExtendedEventHandler eventHandler) {
-      this.ct = ct;
+    private FormatterDependencyResolver(ExtendedEventHandler eventHandler) {
       this.eventHandler = eventHandler;
     }
 
-    protected FormatterDependencyResolver setCt(ConfiguredTarget ct) {
-      this.ct = ct;
-      return this;
-    }
-
     @Override
     protected void invalidVisibilityReferenceHook(TargetAndConfiguration node, Label label) {
       eventHandler.handle(
@@ -253,30 +238,6 @@
           .filter(partialResultMap::containsKey)
           .collect(Collectors.toMap(Function.identity(), partialResultMap::get));
     }
-
-    @Override
-    protected List<BuildConfiguration> getConfigurations(
-        FragmentClassSet fragments,
-        Iterable<BuildOptions> buildOptions,
-        BuildOptions defaultOptions) {
-      Preconditions.checkArgument(
-          ct.getConfigurationKey().getFragments().equals(fragments.fragmentClasses()),
-          "Mismatch: %s %s",
-          ct,
-          fragments);
-      Dependency asDep =
-          Dependency.withTransitionAndAspects(
-              ct.getLabel(), NoTransition.INSTANCE, AspectCollection.EMPTY);
-      ImmutableList.Builder<BuildConfiguration> builder = ImmutableList.builder();
-      for (BuildOptions options : buildOptions) {
-        builder.add(
-            Iterables.getOnlyElement(
-                skyframeExecutor
-                    .getConfigurations(eventHandler, options, ImmutableList.<Dependency>of(asDep))
-                    .values()));
-      }
-      return builder.build();
-    }
   }
 }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 87763a2..6f2d6b5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -471,7 +471,6 @@
               configConditions,
               toolchainLabels,
               transitiveRootCauses,
-              defaultBuildOptions,
               ((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory());
     } catch (EvalException e) {
       // EvalException can only be thrown by computed Skylark attributes in the current rule.
@@ -479,8 +478,6 @@
       throw new DependencyEvaluationException(
           new ConfiguredValueCreationException(
               e.print(), ctgValue.getLabel(), ctgValue.getConfiguration()));
-    } catch (InvalidConfigurationException e) {
-      throw new DependencyEvaluationException(e);
     } catch (InconsistentAspectOrderException e) {
       env.getListener().handle(Event.error(e.getLocation(), e.getMessage()));
       throw new DependencyEvaluationException(e);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
index 9e05215..20898fd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
@@ -28,7 +28,6 @@
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
-import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.BuildType;
@@ -126,15 +125,15 @@
               /*aspect=*/ null,
               configConditions,
               /*toolchainLabels=*/ ImmutableSet.of(),
-              defaultBuildOptions,
               ((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory());
       if (configuredTargetAndData.getConfiguration() != null) {
         deps =
             ConfigurationResolver.resolveConfigurations(
                 env, ctgValue, deps, hostConfiguration, ruleClassProvider, defaultBuildOptions);
       }
-    } catch (EvalException | ConfiguredTargetFunction.DependencyEvaluationException
-        | InvalidConfigurationException | InconsistentAspectOrderException e) {
+    } catch (EvalException
+        | ConfiguredTargetFunction.DependencyEvaluationException
+        | InconsistentAspectOrderException e) {
       throw new PostConfiguredTargetFunctionException(e);
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
index 1e78a41..dabc649 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
@@ -14,15 +14,10 @@
 package com.google.devtools.build.lib.skyframe;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.devtools.build.lib.analysis.DependencyResolver;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
-import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.causes.Cause;
 import com.google.devtools.build.lib.causes.LoadingFailedCause;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -37,10 +32,8 @@
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.ValueOrException;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
 
@@ -141,29 +134,4 @@
     }
     return result;
   }
-
-  @Nullable
-  @Override
-  protected List<BuildConfiguration> getConfigurations(
-      FragmentClassSet fragments,
-      Iterable<BuildOptions> buildOptions,
-      BuildOptions defaultBuildOptions)
-      throws InvalidConfigurationException, InterruptedException {
-    List<SkyKey> keys = new ArrayList<>();
-    for (BuildOptions options : buildOptions) {
-      keys.add(
-          BuildConfigurationValue.key(
-              fragments, BuildOptions.diffForReconstruction(defaultBuildOptions, options)));
-    }
-    Map<SkyKey, ValueOrException<InvalidConfigurationException>> configValues =
-        env.getValuesOrThrow(keys, InvalidConfigurationException.class);
-    if (env.valuesMissing()) {
-      return null;
-    }
-    ImmutableList.Builder<BuildConfiguration> result = ImmutableList.builder();
-    for (SkyKey key : keys) {
-      result.add(((BuildConfigurationValue) configValues.get(key).get()).getConfiguration());
-    }
-    return result.build();
-  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
index 3da6225..cd1a3de 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
@@ -18,7 +18,6 @@
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
@@ -76,7 +75,6 @@
   public void setupCustomLateBoundRules() throws Exception {
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
-    builder.addRuleDefinition(LateBoundSplitUtil.RULE_WITH_LATEBOUND_SPLIT_ATTR);
     builder.addRuleDefinition(LateBoundSplitUtil.RULE_WITH_TEST_FRAGMENT);
     builder.addConfigurationFragment(new LateBoundSplitUtil.FragmentLoader());
     builder.addConfigurationOptions(LateBoundSplitUtil.TestOptions.class);
@@ -125,49 +123,4 @@
     // configuration doesn't happen to match what the patch would have done.
     assertThat(LateBoundSplitUtil.getOptions(getConfiguration(dep)).fooFlag).isEmpty();
   }
-
-  @Test
-  public void lateBoundSplitAttributeInTargetConfiguration() throws Exception {
-    scratch.file("foo/BUILD",
-        "rule_with_latebound_split(",
-        "    name = 'foo')",
-        "rule_with_test_fragment(",
-        "    name = 'latebound_dep')");
-    // if the target fails to analyze, this iterable will be empty
-    assertThat(update("//foo:foo").getTargetsToBuild()).isNotEmpty();
-    Iterable<ConfiguredTarget> deps =
-        SkyframeExecutorTestUtils.getExistingConfiguredTargets(
-            skyframeExecutor, Label.parseAbsolute("//foo:latebound_dep", ImmutableMap.of()));
-    assertThat(deps).hasSize(2);
-    assertThat(
-            ImmutableList.of(
-                LateBoundSplitUtil.getOptions(getConfiguration(Iterables.get(deps, 0))).fooFlag,
-                LateBoundSplitUtil.getOptions(getConfiguration(Iterables.get(deps, 1))).fooFlag))
-        .containsExactly("one", "two");
-  }
-
-  @Test
-  public void lateBoundSplitAttributeInHostConfiguration() throws Exception {
-    scratch.file("foo/BUILD",
-        "genrule(",
-        "    name = 'gen',",
-        "    srcs = [],",
-        "    outs = ['gen.out'],",
-        "    cmd = 'echo hi > $@',",
-        "    tools = [':foo'])",
-        "rule_with_latebound_split(",
-        "    name = 'foo')",
-        "rule_with_test_fragment(",
-        "    name = 'latebound_dep')");
-    update("//foo:gen");
-    assertThat(getConfiguredTarget("//foo:foo", getHostConfiguration())).isNotNull();
-    ConfiguredTarget dep =
-        Iterables.getOnlyElement(
-            SkyframeExecutorTestUtils.getExistingConfiguredTargets(
-                skyframeExecutor, Label.parseAbsolute("//foo:latebound_dep", ImmutableMap.of())));
-    assertThat(getConfiguration(dep)).isEqualTo(getHostConfiguration());
-    // This is technically redundant, but slightly stronger in sanity checking that the host
-    // configuration doesn't happen to match what the split would have done.
-    assertThat(LateBoundSplitUtil.getOptions(getConfiguration(dep)).fooFlag).isEmpty();
-  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
index 4ee313c..c653195 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
@@ -19,13 +19,8 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Streams;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
-import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
 import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
 import com.google.devtools.build.lib.analysis.util.TestAspects;
-import com.google.devtools.build.lib.bazel.rules.DefaultBuildOptionsForDiffing;
 import com.google.devtools.build.lib.causes.Cause;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -40,11 +35,9 @@
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
-import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
-import javax.annotation.Nullable;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -105,16 +98,6 @@
                           }
                         }));
           }
-
-          @Nullable
-          @Override
-          protected List<BuildConfiguration> getConfigurations(
-              FragmentClassSet fragments,
-              Iterable<BuildOptions> buildOptions,
-              BuildOptions defaultBuildOptions) {
-            throw new UnsupportedOperationException(
-                "this functionality is covered by analysis-phase integration tests");
-          }
         };
   }
 
@@ -130,10 +113,8 @@
         new TargetAndConfiguration(target, getTargetConfiguration()),
         getHostConfiguration(),
         aspect != null ? Aspect.forNative(aspect) : null,
-        ImmutableMap.<Label, ConfigMatchingProvider>of(),
+        ImmutableMap.of(),
         /*toolchainLabels=*/ ImmutableSet.of(),
-        DefaultBuildOptionsForDiffing.getDefaultBuildOptionsForFragments(
-            ruleClassProvider.getConfigurationOptions()),
         /*trimmingTransitionFactory=*/ null);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java
index c608526..b099c93 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java
@@ -14,22 +14,15 @@
 
 package com.google.devtools.build.lib.analysis;
 
-import static com.google.devtools.build.lib.packages.Attribute.attr;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
-import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.util.MockRule;
-import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
-import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionEffectTag;
@@ -49,18 +42,6 @@
     public String fooFlag;
   }
 
-  /** The split. */
-  @AutoCodec @AutoCodec.VisibleForSerialization
-  static final SplitTransition SIMPLE_SPLIT =
-      (SplitTransition)
-          buildOptions -> {
-            BuildOptions split1 = buildOptions.clone();
-            split1.get(TestOptions.class).fooFlag = "one";
-            BuildOptions split2 = buildOptions.clone();
-            split2.get(TestOptions.class).fooFlag = "two";
-            return ImmutableList.of(split1, split2);
-          };
-
   /** The {@link BuildConfiguration.Fragment} that contains the options. */
   @AutoCodec
   static class TestFragment extends BuildConfiguration.Fragment {
@@ -86,25 +67,6 @@
     }
   }
 
-  /** A custom rule that applies a late-bound split attribute. */
-  static final RuleDefinition RULE_WITH_LATEBOUND_SPLIT_ATTR =
-      (MockRule)
-          () ->
-              MockRule.define(
-                  "rule_with_latebound_split",
-                  (builder, env) -> {
-                    builder
-                        .add(
-                            attr(":latebound_split_attr", BuildType.LABEL)
-                                .allowedFileTypes(FileTypeSet.ANY_FILE)
-                                .allowedRuleClasses(Attribute.ANY_RULE)
-                                .cfg(SIMPLE_SPLIT)
-                                .value(
-                                    Attribute.LateBoundDefault.fromConstantForTesting(
-                                        Label.parseAbsoluteUnchecked("//foo:latebound_dep"))))
-                        .requiresConfigurationFragments(TestFragment.class);
-                  });
-
   /**
    * A custom rule that requires {@link TestFragment}.
    */
@@ -118,7 +80,6 @@
   static ConfiguredRuleClassProvider getRuleClassProvider() {
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
-    builder.addRuleDefinition(RULE_WITH_LATEBOUND_SPLIT_ATTR);
     builder.addRuleDefinition(RULE_WITH_TEST_FRAGMENT);
     builder.addConfigurationFragment(new FragmentLoader());
     builder.addConfigurationOptions(TestOptions.class);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
index 48252d7..67e1da8 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
@@ -21,7 +21,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Streams;
 import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
@@ -30,7 +29,6 @@
 import com.google.devtools.build.lib.analysis.AnalysisOptions;
 import com.google.devtools.build.lib.analysis.AnalysisResult;
 import com.google.devtools.build.lib.analysis.AnalysisUtils;
-import com.google.devtools.build.lib.analysis.AspectCollection;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.BuildView;
 import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment;
@@ -52,7 +50,6 @@
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
-import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.config.TransitionResolver;
 import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
@@ -275,8 +272,7 @@
       final ConfiguredTarget ct,
       BuildConfigurationCollection configurations,
       ImmutableSet<Label> toolchainLabels)
-      throws EvalException, InvalidConfigurationException, InterruptedException,
-      InconsistentAspectOrderException {
+      throws EvalException, InterruptedException, InconsistentAspectOrderException {
 
     Target target = null;
     try {
@@ -333,29 +329,6 @@
                       }
                     }));
       }
-
-      @Override
-      protected List<BuildConfiguration> getConfigurations(
-          FragmentClassSet fragments,
-          Iterable<BuildOptions> buildOptions,
-          BuildOptions defaultBuildOptions) {
-        Preconditions.checkArgument(
-            fragments.fragmentClasses().equals(ct.getConfigurationKey().getFragments()),
-            "Mismatch: %s %s",
-            ct,
-            fragments);
-        Dependency asDep = Dependency.withTransitionAndAspects(ct.getLabel(),
-            NoTransition.INSTANCE, AspectCollection.EMPTY);
-        ImmutableList.Builder<BuildConfiguration> builder = ImmutableList.builder();
-        for (BuildOptions options : buildOptions) {
-          builder.add(Iterables.getOnlyElement(
-              skyframeExecutor
-                  .getConfigurations(eventHandler, options, ImmutableList.<Dependency>of(asDep))
-                  .values()
-          ));
-        }
-        return builder.build();
-      }
     }
 
     DependencyResolver dependencyResolver = new SilentDependencyResolver();
@@ -368,7 +341,6 @@
         /*aspect=*/ null,
         getConfigurableAttributeKeysForTesting(eventHandler, ctgNode),
         toolchainLabels,
-        skyframeExecutor.getDefaultBuildOptions(),
         ruleClassProvider.getTrimmingTransitionFactory());
   }