diff options
author | Pedro Liberal Fernandez <plf@google.com> | 2017-01-11 13:31:14 +0000 |
---|---|---|
committer | Marcel Hlopko <hlopko@google.com> | 2017-01-11 16:02:15 +0000 |
commit | 45bddab11593ca1536e4d3402fbb631e335e9f3a (patch) | |
tree | dcd8575c581d0b7fe660e17d9246dec501a434fe /src/main/java/com | |
parent | 3c1e40435ba09d90aa64872e4fc23626e9417974 (diff) |
Rollback of commit 0d1dc5537903a8c2ad56e66cee129b8f4d4e2592.
--
PiperOrigin-RevId: 144194956
MOS_MIGRATED_REVID=144194956
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java | 58 |
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; } /** |