Introduce SplitTransitionProvider, to determine the split transition on an attribute based on the Rule itself (the transition may thus be determined based on the values of other attributes of the rule)
--
MOS_MIGRATED_REVID=120275649
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 b8a6f49..07d5a28 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
@@ -15,6 +15,7 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST;
+import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.SPLIT;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
@@ -27,8 +28,12 @@
import static org.junit.Assert.fail;
import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
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.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -258,4 +263,49 @@
assertFalse(attr("foo_nonconfigurable", BuildType.LABEL_LIST).legacyAllowAnyFileType()
.nonconfigurable("test").build().isConfigurable());
}
+
+ @Test
+ public void testSplitTransition() throws Exception {
+ TestSplitTransition splitTransition = new TestSplitTransition();
+ Attribute attr = attr("foo", LABEL).cfg(splitTransition).allowedFileTypes().build();
+ assertThat(attr.getConfigurationTransition()).isEqualTo(SPLIT);
+ assertTrue(attr.hasSplitConfigurationTransition());
+ assertThat(attr.getSplitTransition(null)).isEqualTo(splitTransition);
+ }
+
+ @Test
+ public void testSplitTransitionProvider() throws Exception {
+ TestSplitTransitionProvider splitTransitionProvider = new TestSplitTransitionProvider();
+ Attribute attr =
+ attr("foo", LABEL).cfg(splitTransitionProvider).allowedFileTypes().build();
+ assertThat(attr.getConfigurationTransition()).isEqualTo(SPLIT);
+ assertTrue(attr.hasSplitConfigurationTransition());
+ assertTrue(attr.getSplitTransition(null) instanceof TestSplitTransition);
+ }
+
+ @Test
+ public void testHostTransition() throws Exception {
+ Attribute attr = attr("foo", LABEL).cfg(HOST).allowedFileTypes().build();
+ assertThat(attr.getConfigurationTransition()).isEqualTo(HOST);
+ assertFalse(attr.hasSplitConfigurationTransition());
+ }
+
+ private static class TestSplitTransition implements SplitTransition<BuildOptions> {
+ @Override
+ public boolean defaultsToSelf() {
+ return true;
+ }
+
+ @Override
+ public List<BuildOptions> split(BuildOptions buildOptions) {
+ return ImmutableList.of(buildOptions.clone(), buildOptions.clone());
+ }
+ }
+
+ private static class TestSplitTransitionProvider implements SplitTransitionProvider {
+ @Override
+ public SplitTransition<?> apply(Rule fromRule) {
+ return new TestSplitTransition();
+ }
+ }
}