Try to prevent unrolling nested sets in NestedSetBuilder.

If the set being built has stable order (direct/transitive member order does not matter), then we can add the nested set as a transitive member. There are some cases where the set being built has a different order, and it is likely unintentional that callers are adding nested sets as direct members. That will require more investigation.

RELNOTES: None.
PiperOrigin-RevId: 249715275
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetBuilder.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetBuilder.java
index 037540f..3abfe4c 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetBuilder.java
@@ -21,7 +21,6 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.MapMaker;
 import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet;
-import com.google.errorprone.annotations.DoNotCall;
 import java.util.concurrent.ConcurrentMap;
 
 /**
@@ -91,6 +90,19 @@
    */
   public NestedSetBuilder<E> addAll(Iterable<? extends E> elements) {
     Preconditions.checkNotNull(elements);
+    if (elements instanceof NestedSet) {
+      NestedSet<? extends E> elementsAsNestedSet = (NestedSet<? extends E>) elements;
+      if (order.equals(Order.STABLE_ORDER)) {
+        // If direct/transitive order doesn't matter, add the nested set as a transitive member to
+        // avoid copying its elements.
+        return addTransitive(elementsAsNestedSet);
+      } else {
+        // Direct/transitive order matters, but we might be able to save an iteration if we hit the
+        // Iterables.size call below with a list instead of a nested set.
+        // TODO(jhorvitz): Are callers doing this intentionally?
+        elements = elementsAsNestedSet.toList();
+      }
+    }
     if (items == null) {
       items = CompactHashSet.createWithExpectedSize(Iterables.size(elements));
     }
@@ -98,13 +110,6 @@
     return this;
   }
 
-  /** @deprecated Use {@link #addTransitive} to avoid excessive memory use. */
-  @Deprecated
-  @DoNotCall
-  public NestedSetBuilder<E> addAll(NestedSet<? extends E> elements) {
-    throw new UnsupportedOperationException();
-  }
-
   /**
    * Adds a nested set as a transitive member to the set to be built.
    *