Update Attribute to use a single TransitionFactory for patch and split
transitions.
Part of work on #7814.
Closes #7859.
PiperOrigin-RevId: 240797521
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 c60143b..7ec4b3e 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
@@ -52,8 +52,8 @@
import com.google.devtools.build.lib.analysis.config.FragmentCollection;
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.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.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
@@ -88,6 +88,7 @@
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleErrorConsumer;
+import com.google.devtools.build.lib.packages.RuleTransitionData;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
@@ -823,9 +824,14 @@
getSplitPrerequisiteConfiguredTargetAndTargets(String attributeName) {
checkAttribute(attributeName, Mode.SPLIT);
Attribute attributeDefinition = attributes().getAttributeDefinition(attributeName);
+ Preconditions.checkState(attributeDefinition.hasSplitConfigurationTransition());
SplitTransition transition =
- attributeDefinition.getSplitTransition(
- ConfiguredAttributeMapper.of(rule, configConditions));
+ (SplitTransition)
+ attributeDefinition
+ .getTransitionFactory()
+ .create(
+ RuleTransitionData.create(
+ ConfiguredAttributeMapper.of(rule, configConditions)));
BuildOptions fromOptions = getConfiguration().getOptions();
List<BuildOptions> splitOptions = transition.split(fromOptions);
List<ConfiguredTargetAndData> deps = getConfiguredTargetAndTargetDeps(attributeName);
@@ -1154,17 +1160,16 @@
throw new IllegalStateException(getRuleClassNameForLogging() + " attribute " + attributeName
+ " is not a label type attribute");
}
- // TODO(https://github.com/bazelbuild/bazel/issues/7814): Refactor this to be more clear and
- // not require a specific ConfigurationTransition.
- ConfigurationTransition transition = attributeDefinition.getConfigurationTransition(null);
+ TransitionFactory<RuleTransitionData> transitionFactory =
+ attributeDefinition.getTransitionFactory();
if (mode == Mode.HOST) {
- if (!(transition instanceof PatchTransition)) {
+ if (transitionFactory.isSplit()) {
throw new IllegalStateException(getRule().getLocation() + ": "
+ getRuleClassNameForLogging() + " attribute " + attributeName
+ " is not configured for the host configuration");
}
} else if (mode == Mode.TARGET) {
- if (!(transition instanceof PatchTransition) && transition != NoTransition.INSTANCE) {
+ if (transitionFactory.isSplit() && !NoTransition.isInstance(transitionFactory)) {
throw new IllegalStateException(getRule().getLocation() + ": "
+ getRuleClassNameForLogging() + " attribute " + attributeName
+ " is not configured for the target configuration");