Replace Attribute.SplitTransition with config.transitions.SplitTransition.

PiperOrigin-RevId: 179948322
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 7b9d60d..d268e7d 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
@@ -27,6 +27,7 @@
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.config.PatchTransition;
 import com.google.devtools.build.lib.analysis.config.TransitionResolver;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -422,7 +423,7 @@
    * transition does not apply.
    *
    * <p>Even though the attribute may have a split, splits don't have to apply in every
-   * configuration (see {@link Attribute.SplitTransition#split}).
+   * configuration (see {@link SplitTransition#split}).
    */
   private static Collection<BuildOptions> getSplitOptions(ConfiguredAttributeMapper attributeMap,
       Attribute attribute,
@@ -430,9 +431,7 @@
     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(attributeMap);
+    SplitTransition transition = attribute.getSplitTransition(attributeMap);
     return transition.split(ruleConfig.getOptions());
   }
 
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 6abf491..ce2569a 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
@@ -47,6 +47,7 @@
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.analysis.config.FragmentCollection;
 import com.google.devtools.build.lib.analysis.config.PatchTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.fileset.FilesetProvider;
@@ -65,7 +66,6 @@
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.packages.Attribute;
 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.AttributeMap;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy;
@@ -768,10 +768,8 @@
     checkAttribute(attributeName, Mode.SPLIT);
 
     Attribute attributeDefinition = attributes().getAttributeDefinition(attributeName);
-    @SuppressWarnings("unchecked") // Attribute.java doesn't have the BuildOptions symbol.
-    SplitTransition<BuildOptions> transition =
-        (SplitTransition<BuildOptions>) attributeDefinition.getSplitTransition(
-            ConfiguredAttributeMapper.of(rule, configConditions));
+    SplitTransition transition = 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/ComposingSplitTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingSplitTransition.java
index b984ee4..41cb44d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingSplitTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingSplitTransition.java
@@ -16,9 +16,9 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
 import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
 import java.util.List;
 
 /**
@@ -35,7 +35,7 @@
  * combination thereof. We implement this class as a {@link SplitTransition} since that abstraction
  * captures all possible combinations.
  */
-public class ComposingSplitTransition implements SplitTransition<BuildOptions> {
+public class ComposingSplitTransition implements SplitTransition {
   private Transition transition1;
   private Transition transition2;
 
@@ -63,7 +63,7 @@
    */
   private Transition verifySupported(Transition transition) {
     Preconditions.checkArgument(transition instanceof PatchTransition
-        || transition instanceof SplitTransition<?>);
+        || transition instanceof SplitTransition);
     return transition;
   }
 
@@ -77,7 +77,7 @@
     } else if (transition instanceof PatchTransition) {
       return ImmutableList.<BuildOptions>of(((PatchTransition) transition).apply(fromOptions));
     } else if (transition instanceof SplitTransition) {
-      SplitTransition split = (SplitTransition<BuildOptions>) transition;
+      SplitTransition split = (SplitTransition) transition;
       List<BuildOptions> splitOptions = split.split(fromOptions);
       if (splitOptions.isEmpty()) {
         return ImmutableList.<BuildOptions>of(fromOptions);
@@ -91,4 +91,3 @@
     }
   }
 }
-
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
index 9a16f0b..d09219e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
@@ -26,6 +26,7 @@
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.analysis.Dependency;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety;
@@ -417,10 +418,8 @@
     } else if (transition instanceof PatchTransition) {
       // TODO(bazel-team): safety-check that this never mutates fromOptions.
       result = ImmutableList.<BuildOptions>of(((PatchTransition) transition).apply(fromOptions));
-    } else if (transition instanceof Attribute.SplitTransition) {
-      @SuppressWarnings("unchecked") // Attribute.java doesn't have the BuildOptions symbol.
-      List<BuildOptions> toOptions =
-          ((Attribute.SplitTransition<BuildOptions>) transition).split(fromOptions);
+    } else if (transition instanceof SplitTransition) {
+      List<BuildOptions> toOptions = ((SplitTransition) transition).split(fromOptions);
       if (toOptions.isEmpty()) {
         // When the split returns an empty list, it's signaling it doesn't apply to this instance.
         // So return the original options.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java b/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
index 0ccb19a..4c49201 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.analysis.config;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.RuleClass;
@@ -72,7 +73,7 @@
    */
   public Transition map(Transition fromTransition) {
     if (fromTransition instanceof PatchTransition
-        || fromTransition instanceof Attribute.SplitTransition<?>
+        || fromTransition instanceof SplitTransition
         || fromTransition == null) {
       return fromTransition;
     }
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 b84c5db..27c3548 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
@@ -17,10 +17,10 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
 import com.google.devtools.build.lib.packages.Attribute;
 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.ConfiguredAttributeMapper;
 import com.google.devtools.build.lib.packages.InputFile;
 import com.google.devtools.build.lib.packages.PackageGroup;
@@ -112,8 +112,7 @@
     // TODO(gregce): make the below transitions composable (i.e. take away the "else" clauses).
     // The "else" is a legacy restriction from static configurations.
     if (attribute.hasSplitConfigurationTransition()) {
-      currentTransition = split(currentTransition,
-          (SplitTransition<BuildOptions>) attribute.getSplitTransition(attributeMap));
+      currentTransition = split(currentTransition, attribute.getSplitTransition(attributeMap));
     } else {
       // III. Attributes determine configurations. The configuration of a prerequisite is determined
       // by the attribute.
@@ -195,8 +194,7 @@
   /**
    * Applies the given split and composes it after an existing transition.
    */
-  private static Transition split(Transition currentTransition,
-      SplitTransition<BuildOptions> split) {
+  private static Transition split(Transition currentTransition, SplitTransition split) {
     Preconditions.checkState(currentTransition != Attribute.ConfigurationTransition.NULL,
         "cannot apply splits after null transitions (null transitions are expected to be final)");
     Preconditions.checkState(currentTransition != HostTransition.INSTANCE,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/SplitTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/SplitTransition.java
index 9dc4eee..dd1cea1 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/SplitTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/SplitTransition.java
@@ -24,6 +24,7 @@
  * handle this.
  */
 @ThreadSafety.Immutable
+@FunctionalInterface
 public interface SplitTransition extends Transition {
   /**
    * Return the list of {@code BuildOptions} after splitting; empty if not applicable.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
index b04a855..78e393f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
@@ -20,13 +20,13 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet;
 import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
 import com.google.devtools.build.lib.packages.Attribute.SkylarkComputedDefaultTemplate;
-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.AttributeValueSource;
 import com.google.devtools.build.lib.packages.BuildType;
@@ -298,8 +298,8 @@
         builder.cfg(ConfigurationTransition.DATA);
       } else if (trans.equals("host")) {
         builder.cfg(HostTransition.INSTANCE);
-      } else if (trans instanceof SplitTransition<?>) {
-        builder.cfg((SplitTransition<?>) trans);
+      } else if (trans instanceof SplitTransition) {
+        builder.cfg((SplitTransition) trans);
       } else if (trans instanceof SplitTransitionProvider) {
         builder.cfg((SplitTransitionProvider) trans);
       } else if (!trans.equals("target")) {
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 b736613..38fdda7 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
@@ -29,8 +29,8 @@
 import com.google.common.collect.Ordering;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
-import com.google.devtools.build.lib.concurrent.ThreadSafety;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassNamePredicate;
@@ -148,23 +148,6 @@
   }
 
   /**
-   * A configuration split transition; this should be used to transition to multiple configurations
-   * simultaneously. Note that the corresponding rule implementations must have special support to
-   * handle this.
-   *
-   * <p>{@code T} must always be {@code BuildOptions}, but it can't be defined that way because
-   * the symbol isn't available here.
-   */
-  // TODO(bazel-team): Serializability constraints?
-  @ThreadSafety.Immutable
-  public interface SplitTransition<T> extends Transition {
-    /**
-     * Return the list of {@code BuildOptions} after splitting; empty if not applicable.
-     */
-    List<T> split(T buildOptions);
-  }
-
-  /**
    * Declaration how the configuration should change when following a label or label list attribute.
    *
    * <p>Do not add to this. Use {@link
@@ -316,7 +299,7 @@
     /**
      * Returns the {@link SplitTransition} given the attribute mapper of the originating rule.
      */
-    SplitTransition<?> apply(AttributeMap attributeMap);
+    SplitTransition apply(AttributeMap attributeMap);
   }
 
   /**
@@ -325,14 +308,14 @@
    */
   private static class BasicSplitTransitionProvider implements SplitTransitionProvider {
 
-    private final SplitTransition<?> splitTransition;
+    private final SplitTransition splitTransition;
 
-    BasicSplitTransitionProvider(SplitTransition<?> splitTransition) {
+    BasicSplitTransitionProvider(SplitTransition splitTransition) {
       this.splitTransition = splitTransition;
     }
 
     @Override
-    public SplitTransition<?> apply(AttributeMap attributeMap) {
+    public SplitTransition apply(AttributeMap attributeMap) {
       return splitTransition;
     }
   }
@@ -533,7 +516,7 @@
      * Defines the configuration transition for this attribute. Defaults to
      * {@code NONE}.
      */
-    public Builder<TYPE> cfg(SplitTransition<?> configTransition) {
+    public Builder<TYPE> cfg(SplitTransition configTransition) {
       return cfg(new BasicSplitTransitionProvider(Preconditions.checkNotNull(configTransition)));
     }
 
@@ -547,7 +530,7 @@
       Preconditions.checkArgument(configTransition != ConfigurationTransition.SPLIT,
           "split transitions must be defined using the SplitTransition object");
       if (configTransition instanceof SplitTransition) {
-        return cfg((SplitTransition<?>) configTransition);
+        return cfg((SplitTransition) configTransition);
       } else {
         this.configTransition = configTransition;
         return this;
@@ -1971,7 +1954,7 @@
    * @return a SplitTransition<BuildOptions> object
    * @throws IllegalStateException if {@link #hasSplitConfigurationTransition} is not true
    */
-  public SplitTransition<?> getSplitTransition(AttributeMap attributeMapper) {
+  public SplitTransition getSplitTransition(AttributeMap attributeMapper) {
     Preconditions.checkState(hasSplitConfigurationTransition());
     return splitTransitionProvider.apply(attributeMapper);
   }
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 6a8a0a9..c08da7a 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
@@ -37,13 +37,13 @@
 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.HostTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet;
 import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.Rule;
@@ -206,11 +206,9 @@
         (rule, attributes, configuration) -> configuration.getSdk());
   }
 
-  public static final SplitTransition<BuildOptions> ANDROID_SPLIT_TRANSITION =
-      new AndroidSplitTransition();
+  public static final SplitTransition ANDROID_SPLIT_TRANSITION = new AndroidSplitTransition();
 
-  private static final class AndroidSplitTransition
-      implements SplitTransition<BuildOptions>, SkylarkValue {
+  private static final class AndroidSplitTransition implements SplitTransition, SkylarkValue {
     private static void setCrosstoolToAndroid(BuildOptions output, BuildOptions input) {
       AndroidConfiguration.Options inputAndroidOptions =
           input.get(AndroidConfiguration.Options.class);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
index fe8a9dd..be66ad6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
@@ -14,8 +14,7 @@
 package com.google.devtools.build.lib.rules.android;
 
 import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -47,7 +46,7 @@
             + "the --fat_apk_cpu and --android_crosstool_top flags.",
     structField = true
   )
-  public SplitTransition<BuildOptions> getAndroidSplitTransition() {
+  public SplitTransition getAndroidSplitTransition() {
     return AndroidRuleClasses.ANDROID_SPLIT_TRANSITION;
   }
 }
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 394c220..8284011 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
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.packages.Attribute.SplitTransitionProvider;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
@@ -125,7 +125,7 @@
   }
 
   @Override
-  public SplitTransition<?> apply(AttributeMap attrMapper) {
+  public SplitTransition apply(AttributeMap attrMapper) {
     String platformTypeString = attrMapper.get(PlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING);
     String minimumOsVersionString = attrMapper.get(PlatformRule.MINIMUM_OS_VERSION, STRING);
     PlatformType platformType;
@@ -164,7 +164,7 @@
    * platform-specific cpu flag for a particular platform type (for example, --watchos_cpus
    * for watchos platform type).
    */
-  protected static class AppleBinaryTransition implements SplitTransition<BuildOptions> {
+  protected static class AppleBinaryTransition implements SplitTransition {
 
     private final PlatformType platformType;
     // TODO(b/37096178): This should be a mandatory attribute.
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 4296f10..a721f4e 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
@@ -24,6 +24,7 @@
 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.InvalidConfigurationException;
+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;
@@ -33,7 +34,6 @@
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionEffectTag;
-import java.util.List;
 
 /**
  * Rule and configuration class definitions for testing late-bound split attributes.
@@ -55,17 +55,14 @@
   /**
    * The split.
    */
-  private static final Attribute.SplitTransition<BuildOptions> SIMPLE_SPLIT =
-      new Attribute.SplitTransition<BuildOptions>() {
-    @Override
-    public List<BuildOptions> split(BuildOptions buildOptions) {
-      BuildOptions split1 = buildOptions.clone();
-      split1.get(TestOptions.class).fooFlag = "one";
-      BuildOptions split2 = buildOptions.clone();
-      split2.get(TestOptions.class).fooFlag = "two";
-      return ImmutableList.<BuildOptions>of(split1, split2);
-    }
-  };
+  private 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.
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 4adef68..f4b5662 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
@@ -27,9 +27,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.util.TestAspects;
 import com.google.devtools.build.lib.cmdline.Label;
-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.RuleClass.Builder.RuleClassNamePredicate;
 import com.google.devtools.build.lib.syntax.Type;
@@ -295,7 +295,7 @@
     assertThat(attr.hasSplitConfigurationTransition()).isFalse();
   }
 
-  private static class TestSplitTransition implements SplitTransition<BuildOptions> {
+  private static class TestSplitTransition implements SplitTransition {
     @Override
     public List<BuildOptions> split(BuildOptions buildOptions) {
       return ImmutableList.of(buildOptions.clone(), buildOptions.clone());
@@ -304,7 +304,7 @@
 
   private static class TestSplitTransitionProvider implements SplitTransitionProvider {
     @Override
-    public SplitTransition<?> apply(AttributeMap attrMapper) {
+    public SplitTransition apply(AttributeMap attrMapper) {
       return new TestSplitTransition();
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java
index c5577e7..74b5a4d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java
@@ -74,11 +74,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.CompilationMode;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.analysis.util.ScratchAttributeWriter;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
 import com.google.devtools.build.lib.packages.util.MockJ2ObjcSupport;
 import com.google.devtools.build.lib.packages.util.MockObjcSupport;
 import com.google.devtools.build.lib.packages.util.MockProtoSupport;
@@ -420,7 +420,7 @@
    * configuration.
    */
   protected List<BuildConfiguration> getSplitConfigurations(BuildConfiguration configuration,
-      SplitTransition<BuildOptions> splitTransition) throws InterruptedException {
+      SplitTransition splitTransition) throws InterruptedException {
     ImmutableList.Builder<BuildConfiguration> splitConfigs = ImmutableList.builder();
 
     for (BuildOptions splitOptions : splitTransition.split(configuration.getOptions())) {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java
index 56c4d29..64e141d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
 import com.google.devtools.build.lib.analysis.config.PatchTransition;
 import com.google.devtools.build.lib.analysis.config.TransitionResolver;
+import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.Transition;
 import com.google.devtools.build.lib.analysis.test.TestConfiguration;
 import com.google.devtools.build.lib.analysis.util.MockRule;
@@ -38,8 +39,6 @@
 import com.google.devtools.build.lib.analysis.util.TestAspects;
 import com.google.devtools.build.lib.analysis.util.TestAspects.DummyRuleFactory;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
 import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleTransitionFactory;
@@ -70,14 +69,14 @@
     return super.defaultFlags().with(Flag.TRIMMED_CONFIGURATIONS);
   }
 
-  private static class EmptySplitTransition implements SplitTransition<BuildOptions> {
+  private static class EmptySplitTransition implements SplitTransition {
     @Override
     public List<BuildOptions> split(BuildOptions buildOptions) {
       return ImmutableList.of();
     }
   }
 
-  private static class SetsHostCpuSplitTransition implements SplitTransition<BuildOptions> {
+  private static class SetsHostCpuSplitTransition implements SplitTransition {
     @Override
     public List<BuildOptions> split(BuildOptions buildOptions) {
       BuildOptions result = buildOptions.clone();
@@ -86,7 +85,7 @@
     }
   }
 
-  private static class SetsCpuSplitTransition implements SplitTransition<BuildOptions> {
+  private static class SetsCpuSplitTransition implements SplitTransition {
 
     @Override
     public List<BuildOptions> split(BuildOptions buildOptions) {
@@ -368,25 +367,22 @@
   }
 
   /**
-   * Returns a custom {@link Attribute.SplitTransition} that splits {@link
+   * Returns a custom {@link SplitTransition} that splits {@link
    * TestConfiguration.TestOptions#testFilter} down two paths: {@code += prefix + "1"} and {@code +=
    * prefix + "2"}.
    */
-  private static Attribute.SplitTransition<BuildOptions> newSplitTransition(final String prefix) {
-    return new Attribute.SplitTransition<BuildOptions>() {
-      @Override
-      public List<BuildOptions> split(BuildOptions buildOptions) {
-        ImmutableList.Builder<BuildOptions> result = ImmutableList.builder();
-        for (int index = 1; index <= 2; index++) {
-          BuildOptions toOptions = buildOptions.clone();
-          TestConfiguration.TestOptions baseOptions =
-              toOptions.get(TestConfiguration.TestOptions.class);
-          baseOptions.testFilter =
-              (baseOptions.testFilter == null ? "" : baseOptions.testFilter) + prefix + index;
-          result.add(toOptions);
-        }
-        return result.build();
+  private static SplitTransition newSplitTransition(final String prefix) {
+    return buildOptions -> {
+      ImmutableList.Builder<BuildOptions> result = ImmutableList.builder();
+      for (int index = 1; index <= 2; index++) {
+        BuildOptions toOptions = buildOptions.clone();
+        TestConfiguration.TestOptions baseOptions =
+            toOptions.get(TestConfiguration.TestOptions.class);
+        baseOptions.testFilter =
+            (baseOptions.testFilter == null ? "" : baseOptions.testFilter) + prefix + index;
+        result.add(toOptions);
       }
+      return result.build();
     };
   }