Deprecate old ordering names for depsets
Old ordering names ("stable", "compile", "naive_link", "link") are deprecated
and won't be available if --incompatible_disallow_set_constructor=true is set.
Use "default", "postorder", "preorder", and "topological" correspondingly
instead.
PiperOrigin-RevId: 164728439
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/Order.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/Order.java
index b0a7083..d4ae2d6 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/Order.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/Order.java
@@ -140,17 +140,24 @@
}
/**
- * Parses the given string as a set order
+ * Parses the given string as a nested set order
*
- * @param name Unique name of the order
- * @return Order The appropriate order instance
- * @throws IllegalArgumentException If the name is not valid
+ * @param name unique name of the order
+ * @param forbidDeprecatedOrderNames if true, old style ordering names will be rejected
+ * @return the appropriate order instance
+ * @throws IllegalArgumentException if the name is not valid
*/
- public static Order parse(String name) {
+ public static Order parse(String name, boolean forbidDeprecatedOrderNames) {
if (VALUES.containsKey(name)) {
return VALUES.get(name);
} else if (DEPRECATED_VALUES.containsKey(name)) {
- // TODO(bazel-team): Give a deprecation warning or error.
+ if (forbidDeprecatedOrderNames) {
+ throw new IllegalArgumentException(String.format(
+ "Order name '%s' is deprecated, use '%s' instead",
+ name,
+ DEPRECATED_VALUES.get(name).getSkylarkName()
+ ));
+ }
return DEPRECATED_VALUES.get(name);
} else {
throw new IllegalArgumentException("Invalid order: " + name);
@@ -158,6 +165,17 @@
}
/**
+ * Parses the given string as a nested set order
+ *
+ * @param name unique name of the order
+ * @return the appropriate order instance
+ * @throws IllegalArgumentException if the name is not valid
+ */
+ public static Order parse(String name) {
+ return parse(name, false);
+ }
+
+ /**
* Determines whether two orders are considered compatible.
*
* <p>An order is compatible with itself (reflexivity) and all orders are compatible with
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BazelLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/BazelLibrary.java
index 1896e67..8c392c9 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BazelLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BazelLibrary.java
@@ -84,14 +84,17 @@
+ "the possible values."
)
},
- useLocation = true
+ useLocation = true,
+ useEnvironment = true
)
private static final BuiltinFunction depset =
new BuiltinFunction("depset") {
- public SkylarkNestedSet invoke(Object items, String order, Location loc)
+ public SkylarkNestedSet invoke(Object items, String order, Location loc, Environment env)
throws EvalException {
try {
- return new SkylarkNestedSet(Order.parse(order), items, loc);
+ return new SkylarkNestedSet(
+ Order.parse(order, env.getSemantics().incompatibleDisallowSetConstructor),
+ items, loc);
} catch (IllegalArgumentException ex) {
throw new EvalException(loc, ex);
}
@@ -135,7 +138,9 @@
+ "--incompatible_disallow_set_constructor=false");
}
try {
- return new SkylarkNestedSet(Order.parse(order), items, loc);
+ return new SkylarkNestedSet(
+ Order.parse(order, /*forbidDeprecatedOrderNames=*/false),
+ items, loc);
} catch (IllegalArgumentException ex) {
throw new EvalException(loc, ex);
}
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 b96b6ad..5047051 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
@@ -37,6 +37,7 @@
@Test
public void testLegacyConstructor() throws Exception {
+ env = newEnvironmentWithSkylarkOptions("--incompatible_disallow_set_constructor=false");
eval("s = set([1, 2, 3], order='postorder')");
SkylarkNestedSet s = get("s");
assertThat(s.getOrder().getSkylarkName()).isEqualTo("postorder");
@@ -93,8 +94,18 @@
@Test
public void testDeprecatedOrder() throws Exception {
+ env = newEnvironmentWithSkylarkOptions("--incompatible_disallow_set_constructor=false");
eval("s = depset(['a', 'b'], order='compile')");
assertThat(get("s").getSet(String.class).getOrder()).isEqualTo(Order.COMPILE_ORDER);
+
+ env = newEnvironmentWithSkylarkOptions("--incompatible_disallow_set_constructor=true");
+ try {
+ eval("s = depset(['a', 'b'], order='compile')");
+ fail("Should have not accepted a deprecated order name");
+ } catch (Exception e) {
+ assertThat(e).hasMessageThat().contains(
+ "Order name 'compile' is deprecated, use 'postorder' instead");
+ }
}
@Test
@@ -257,9 +268,9 @@
public void testTransitiveOrdering() throws Exception {
eval(
"def func():",
- " sa = depset(['a'], order='compile')",
- " sb = depset(['b'], order='compile')",
- " sc = depset(['c'], order='compile') + sa",
+ " sa = depset(['a'], order='postorder')",
+ " sb = depset(['b'], order='postorder')",
+ " sc = depset(['c'], order='postorder') + sa",
" return depset() + sb + sc",
"s = func()");
// The iterator lists the Transitive sets first