aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Pedro Liberal Fernandez <plf@google.com>2017-01-11 13:31:14 +0000
committerGravatar Marcel Hlopko <hlopko@google.com>2017-01-11 16:02:15 +0000
commit45bddab11593ca1536e4d3402fbb631e335e9f3a (patch)
treedcd8575c581d0b7fe660e17d9246dec501a434fe /src/main/java/com/google/devtools/build/lib
parent3c1e40435ba09d90aa64872e4fc23626e9417974 (diff)
-- PiperOrigin-RevId: 144194956 MOS_MIGRATED_REVID=144194956
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java58
1 files changed, 41 insertions, 17 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java
index df936692aa..fc78da5385 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java
@@ -24,9 +24,12 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.util.Preconditions;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
+import java.util.List;
import java.util.Set;
+import javax.annotation.Nullable;
/** A generic type safe NestedSet wrapper for Skylark. */
@SkylarkModule(
@@ -82,41 +85,47 @@ public final class SkylarkNestedSet implements Iterable<Object>, SkylarkValue, S
private final SkylarkType contentType;
private final NestedSet<?> set;
+ @Nullable
+ private final List<Object> items;
+ @Nullable
+ private final List<NestedSet> transitiveItems;
public SkylarkNestedSet(Order order, Object item, Location loc) throws EvalException {
- this(SkylarkType.TOP, item, loc, new NestedSetBuilder<Object>(order));
+ this(order, SkylarkType.TOP, item, loc, null);
}
public SkylarkNestedSet(SkylarkNestedSet left, Object right, Location loc) throws EvalException {
- this(
- left.contentType,
- right,
- loc,
- new NestedSetBuilder<Object>(left.getOrder()).addTransitive(left.set));
+ this(left.set.getOrder(), left.contentType, right, loc, left);
}
// This is safe because of the type checking
@SuppressWarnings("unchecked")
- private SkylarkNestedSet(
- SkylarkType contentType, Object item, Location loc, NestedSetBuilder setBuilder)
- throws EvalException {
+ private SkylarkNestedSet(Order order, SkylarkType contentType, Object item, Location loc,
+ @Nullable SkylarkNestedSet left) throws EvalException {
+
+ ArrayList<Object> items = new ArrayList<>();
+ ArrayList<NestedSet> transitiveItems = new ArrayList<>();
+ if (left != null) {
+ if (left.items == null) { // SkylarkSet created from native NestedSet
+ transitiveItems.add(left.set);
+ } else { // Preserving the left-to-right addition order.
+ items.addAll(left.items);
+ transitiveItems.addAll(left.transitiveItems);
+ }
+ }
// Adding the item
if (item instanceof SkylarkNestedSet) {
SkylarkNestedSet nestedSet = (SkylarkNestedSet) item;
if (!nestedSet.isEmpty()) {
contentType = checkType(contentType, nestedSet.contentType, loc);
- try {
- setBuilder.addTransitive((NestedSet<Object>) nestedSet.set);
- } catch (IllegalStateException e) {
- // Order mismatch between item and setBuilder.
- throw new EvalException(loc, e.getMessage());
- }
+ transitiveItems.add(nestedSet.set);
}
} else if (item instanceof SkylarkList) {
+ // TODO(bazel-team): we should check ImmutableList here but it screws up genrule at line 43
for (Object object : (SkylarkList) item) {
contentType = checkType(contentType, SkylarkType.of(object.getClass()), loc);
checkImmutable(object, loc);
- setBuilder.add(object);
+ items.add(object);
}
} else {
throw new EvalException(
@@ -125,7 +134,20 @@ public final class SkylarkNestedSet implements Iterable<Object>, SkylarkValue, S
"cannot add value of type '%s' to a depset", EvalUtils.getDataTypeName(item)));
}
this.contentType = Preconditions.checkNotNull(contentType, "type cannot be null");
- this.set = setBuilder.build();
+
+ // Initializing the real nested set
+ NestedSetBuilder<Object> builder = new NestedSetBuilder<>(order);
+ builder.addAll(items);
+ try {
+ for (NestedSet<?> nestedSet : transitiveItems) {
+ builder.addTransitive(nestedSet);
+ }
+ } catch (IllegalStateException e) {
+ throw new EvalException(loc, e.getMessage());
+ }
+ this.set = builder.build();
+ this.items = ImmutableList.copyOf(items);
+ this.transitiveItems = ImmutableList.copyOf(transitiveItems);
}
/**
@@ -150,6 +172,8 @@ public final class SkylarkNestedSet implements Iterable<Object>, SkylarkValue, S
// This is here for the sake of FuncallExpression.
this.contentType = Preconditions.checkNotNull(contentType, "type cannot be null");
this.set = Preconditions.checkNotNull(set, "set cannot be null");
+ this.items = null;
+ this.transitiveItems = null;
}
/**