Implement a flag to deprecate old constructor for depsets (`set`)
Usage: --incompatible_depset_constructor=true (the default value is false).
PiperOrigin-RevId: 154971526
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
index 8fab5eb..4a4cc0f 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
@@ -44,6 +44,17 @@
}
@Test
+ public void testLegacyConstructorDeprecation() throws Exception {
+ env = newEnvironmentWithSkylarkOptions("--incompatible_depset_constructor=true");
+ try {
+ eval("s = set([1, 2, 3], order='postorder')");
+ Assert.fail("`set` should have failed");
+ } catch (EvalException e) {
+ assertThat(e.getMessage()).contains("The `set` constructor for depsets is deprecated");
+ }
+ }
+
+ @Test
public void testConstructor() throws Exception {
eval("s = depset(order='default')");
assertThat(lookup("s")).isInstanceOf(SkylarkNestedSet.class);
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
index d76e2eb..0aa9b0a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
@@ -92,19 +92,25 @@
}
/**
- * Creates a new Environment suitable for the test case. Subclasses may override it
- * to fit their purpose and e.g. call newBuildEnvironment or newSkylarkEnvironment;
- * or they may play with the testMode to run tests in either or both kinds of Environment.
- * Note that all Environment-s may share the same Mutability, so don't close it.
+ * Creates a new Environment suitable for the test case. Subclasses may override it to fit their
+ * purpose and e.g. call newBuildEnvironment or newSkylarkEnvironment; or they may play with the
+ * testMode to run tests in either or both kinds of Environment. Note that all Environment-s may
+ * share the same Mutability, so don't close it.
+ *
* @return a fresh Environment.
*/
public Environment newEnvironment() throws Exception {
+ return newEnvironmentWithSkylarkOptions();
+ }
+
+ protected Environment newEnvironmentWithSkylarkOptions(String... skylarkOptions)
+ throws Exception {
if (testMode == null) {
throw new IllegalArgumentException(
"TestMode is null. Please set a Testmode via setMode() or set the "
+ "Environment manually by overriding newEnvironment()");
}
- return testMode.createEnvironment(getEventHandler(), null);
+ return testMode.createEnvironment(getEventHandler(), skylarkOptions);
}
/**
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestMode.java b/src/test/java/com/google/devtools/build/lib/testutil/TestMode.java
index 21132c2..12b8e6b 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestMode.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestMode.java
@@ -17,19 +17,30 @@
import com.google.devtools.build.lib.syntax.BazelLibrary;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.Mutability;
+import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions;
+import com.google.devtools.common.options.OptionsParser;
/**
* Describes a particular testing mode by determining how the
* appropriate {@code Environment} has to be created
*/
public abstract class TestMode {
+ private static SkylarkSemanticsOptions parseSkylarkSemanticsOptions(String... skylarkOptions)
+ throws Exception {
+ OptionsParser parser = OptionsParser.newOptionsParser(SkylarkSemanticsOptions.class);
+ parser.parse(skylarkOptions);
+ return parser.getOptions(SkylarkSemanticsOptions.class);
+ }
+
public static final TestMode BUILD =
new TestMode() {
@Override
- public Environment createEnvironment(EventHandler eventHandler, Environment environment) {
+ public Environment createEnvironment(EventHandler eventHandler, String... skylarkOptions)
+ throws Exception {
return Environment.builder(Mutability.create("build test"))
- .setGlobals(environment == null ? BazelLibrary.GLOBALS : environment.getGlobals())
+ .setGlobals(BazelLibrary.GLOBALS)
.setEventHandler(eventHandler)
+ .setSemantics(TestMode.parseSkylarkSemanticsOptions(skylarkOptions))
.build();
}
};
@@ -37,13 +48,16 @@
public static final TestMode SKYLARK =
new TestMode() {
@Override
- public Environment createEnvironment(EventHandler eventHandler, Environment environment) {
+ public Environment createEnvironment(EventHandler eventHandler, String... skylarkOptions)
+ throws Exception {
return Environment.builder(Mutability.create("skylark test"))
- .setGlobals(environment == null ? BazelLibrary.GLOBALS : environment.getGlobals())
+ .setGlobals(BazelLibrary.GLOBALS)
.setEventHandler(eventHandler)
+ .setSemantics(TestMode.parseSkylarkSemanticsOptions(skylarkOptions))
.build();
}
};
- public abstract Environment createEnvironment(EventHandler eventHandler, Environment environment);
+ public abstract Environment createEnvironment(EventHandler eventHandler, String... skylarkOptions)
+ throws Exception;
}