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 ee191676a61c47..ef7e2d5f4782db 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
@@ -22,12 +22,12 @@
import com.google.devtools.build.lib.analysis.config.HostTransition;
import com.google.devtools.build.lib.analysis.config.StarlarkDefinedConfigTransition;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
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.ImmutableAttributeFactory;
import com.google.devtools.build.lib.packages.Attribute.SkylarkComputedDefaultTemplate;
-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;
import com.google.devtools.build.lib.packages.Provider;
@@ -252,7 +252,7 @@ && containsNonNoneKey(arguments, ALLOW_SINGLE_FILE_ARG)) {
Object trans = arguments.get(CONFIGURATION_ARG);
boolean isSplit =
trans instanceof SplitTransition
- || trans instanceof SplitTransitionProvider
+ || trans instanceof TransitionFactory
|| trans instanceof StarlarkDefinedConfigTransition;
if (isSplit && defaultValue instanceof SkylarkLateBoundDefault) {
throw new EvalException(
@@ -273,8 +273,8 @@ && containsNonNoneKey(arguments, ALLOW_SINGLE_FILE_ARG)) {
builder.cfg(HostTransition.INSTANCE);
} else if (trans instanceof SplitTransition) {
builder.cfg((SplitTransition) trans);
- } else if (trans instanceof SplitTransitionProvider) {
- builder.cfg((SplitTransitionProvider) trans);
+ } else if (trans instanceof TransitionFactory) {
+ builder.cfg((TransitionFactory) trans);
} else if (trans instanceof StarlarkDefinedConfigTransition) {
StarlarkDefinedConfigTransition starlarkDefinedTransition =
(StarlarkDefinedConfigTransition) trans;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkAttributeTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkAttributeTransitionProvider.java
index b2c831fb7923ff..d9cd1bde96d626 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkAttributeTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkAttributeTransitionProvider.java
@@ -23,13 +23,15 @@
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.StarlarkDefinedConfigTransition;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
+import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransitionProvider;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper;
+import com.google.devtools.build.lib.packages.RuleTransitionData;
import com.google.devtools.build.lib.packages.StructImpl;
import com.google.devtools.build.lib.packages.StructProvider;
+import com.google.devtools.build.lib.skylarkbuildapi.SplitTransitionProviderApi;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.EvalException;
@@ -39,17 +41,18 @@
import java.util.List;
/**
- * This class implements a {@link SplitTransitionProvider} to provide a starlark-defined transition
- * that rules can apply to their dependencies' configurations. This transition has access to (1) the
- * a map of the current configuration's build settings and (2) the configured attributes of the
- * given rule (not its dependencies').
+ * This class implements a {@link TransitionFactory} to provide a starlark-defined transition that
+ * rules can apply to their dependencies' configurations. This transition has access to (1) the a
+ * map of the current configuration's build settings and (2) the configured attributes of the given
+ * rule (not its dependencies').
*
*
For starlark defined rule class transitions, see {@link StarlarkRuleTransitionProvider}.
*
*
TODO(bazel-team): Consider allowing dependency-typed attributes to actually return providers
* instead of just labels (see {@link SkylarkAttributesCollection#addAttribute}).
*/
-public class StarlarkAttributeTransitionProvider implements SplitTransitionProvider {
+public class StarlarkAttributeTransitionProvider
+ implements TransitionFactory, SplitTransitionProviderApi {
private final StarlarkDefinedConfigTransition starlarkDefinedConfigTransition;
StarlarkAttributeTransitionProvider(
@@ -63,7 +66,8 @@ public StarlarkDefinedConfigTransition getStarlarkDefinedConfigTransitionForTest
}
@Override
- public SplitTransition apply(AttributeMap attributeMap) {
+ public SplitTransition create(RuleTransitionData data) {
+ AttributeMap attributeMap = data.attributes();
Preconditions.checkArgument(attributeMap instanceof ConfiguredAttributeMapper);
return new FunctionSplitTransition(
starlarkDefinedConfigTransition, (ConfiguredAttributeMapper) attributeMap);
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 92ce8092d940b9..fc50b903cfb9c9 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
@@ -35,14 +35,13 @@
import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
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.analysis.config.transitions.TransitionFactory;
import com.google.devtools.build.lib.cmdline.Label;
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;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.skylarkbuildapi.SplitTransitionProviderApi;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.syntax.ClassObject;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.EvalUtils;
@@ -287,44 +286,6 @@ public String checkValid(Rule from, Rule to) {
}
};
- /**
- * Provides a {@link SplitTransition} given the originating target {@link Rule}. The split
- * transition may be constant for all instances of the originating rule, or it may differ
- * based on attributes of that rule. For instance, a split transition on a rule's deps may differ
- * depending on the 'platform' attribute of the rule.
- */
- public interface SplitTransitionProvider extends SplitTransitionProviderApi {
- /**
- * Returns the {@link SplitTransition} given the attribute mapper of the originating rule.
- */
- SplitTransition apply(AttributeMap attributeMap);
- }
-
- /**
- * Implementation of {@link SplitTransitionProvider} that returns a single {@link SplitTransition}
- * regardless of the originating rule.
- */
- @AutoCodec.VisibleForSerialization
- @AutoCodec
- static class BasicSplitTransitionProvider implements SplitTransitionProvider {
- private final SplitTransition splitTransition;
-
- @AutoCodec.VisibleForSerialization
- BasicSplitTransitionProvider(SplitTransition splitTransition) {
- this.splitTransition = splitTransition;
- }
-
- @Override
- public SplitTransition apply(AttributeMap attributeMap) {
- return splitTransition;
- }
-
- @Override
- public void repr(SkylarkPrinter printer) {
- printer.append("");
- }
- }
-
/** A predicate class to check if the value of the attribute comes from a predefined set. */
@AutoCodec
public static class AllowedValueSet implements PredicateWithMessage