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