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.
*