aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2016-11-22 18:31:13 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-11-23 08:50:14 +0000
commit0aac8f7d4f2cea1834df4aaf4cad35d3425d874b (patch)
tree1125e9a11160e92ac7b1eb6901e765390dcffcf8 /src/main/java
parent984d6d48d0e07ac3be2bbfec667158165390eb4f (diff)
Remove weird restriction on '|' operator from SkylarkNestedSets.
-- MOS_MIGRATED_REVID=139926067
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java38
1 files changed, 17 insertions, 21 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 16579557ef..28ce63896d 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
@@ -81,43 +81,39 @@ import javax.annotation.Nullable;
public final class SkylarkNestedSet implements Iterable<Object>, SkylarkValue, SkylarkQueryable {
private final SkylarkType contentType;
- @Nullable private final List<Object> items;
- @Nullable private final List<NestedSet<Object>> transitiveItems;
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(order, SkylarkType.TOP, item, loc, new ArrayList<Object>(),
- new ArrayList<NestedSet<Object>>());
+ this(order, SkylarkType.TOP, item, loc, null);
}
public SkylarkNestedSet(SkylarkNestedSet left, Object right, Location loc) throws EvalException {
- this(left.set.getOrder(), left.contentType, right, loc,
- new ArrayList<Object>(checkItems(left.items, loc)),
- new ArrayList<NestedSet<Object>>(checkItems(left.transitiveItems, loc)));
- }
-
- private static <T> T checkItems(T items, Location loc) throws EvalException {
- // SkylarkNestedSets created directly from ordinary NestedSets (those were created in a
- // native rule) don't have directly accessible items and transitiveItems, so we cannot
- // add more elements to them.
- if (items == null) {
- throw new EvalException(loc, "Cannot add more elements to this set. Sets created in "
- + "native rules cannot be left side operands of the + operator.");
- }
- return items;
+ this(left.set.getOrder(), left.contentType, right, loc, left);
}
// This is safe because of the type checking
@SuppressWarnings("unchecked")
private SkylarkNestedSet(Order order, SkylarkType contentType, Object item, Location loc,
- List<Object> items, List<NestedSet<Object>> transitiveItems) throws EvalException {
+ @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);
- transitiveItems.add((NestedSet<Object>) nestedSet.set);
+ 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
@@ -137,7 +133,7 @@ public final class SkylarkNestedSet implements Iterable<Object>, SkylarkValue, S
NestedSetBuilder<Object> builder = new NestedSetBuilder<>(order);
builder.addAll(items);
try {
- for (NestedSet<Object> nestedSet : transitiveItems) {
+ for (NestedSet<?> nestedSet : transitiveItems) {
builder.addTransitive(nestedSet);
}
} catch (IllegalStateException e) {