Inline the size() function.
It was used in only one place. Inlining it makes the code simpler (no need to check twic for NestedSet, no need to return a dummy integer in case of error).
Tests were removed. We already have tests for the len() builtin.
RELNOTES: None.
PiperOrigin-RevId: 234469534
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
index 39256da..5ca655e 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
@@ -426,26 +426,6 @@
return builder.build();
}
- /**
- * @return the size of the Skylark object or -1 in case the object doesn't have a size.
- */
- public static int size(Object arg) {
- if (arg instanceof String) {
- return ((String) arg).length();
- } else if (arg instanceof Map) {
- return ((Map<?, ?>) arg).size();
- } else if (arg instanceof SkylarkList) {
- return ((SkylarkList<?>) arg).size();
- } else if (arg instanceof SkylarkNestedSet) {
- // TODO(bazel-team): Add a deprecation warning: don't implicitly flatten depsets.
- return ((SkylarkNestedSet) arg).toCollection().size();
- } else if (arg instanceof Iterable) {
- // Iterables.size() checks if arg is a Collection so it's efficient in that sense.
- return Iterables.size((Iterable<?>) arg);
- }
- return -1;
- }
-
// The following functions for indexing and slicing match the behavior of Python.
/**
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
index 8b6e12c..75058f1 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
@@ -19,6 +19,7 @@
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -37,6 +38,7 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.TreeSet;
@@ -281,20 +283,28 @@
private static final BuiltinFunction len =
new BuiltinFunction("len") {
public Integer invoke(Object x, Location loc, Environment env) throws EvalException {
- if (env.getSemantics().incompatibleDepsetIsNotIterable()
- && x instanceof SkylarkNestedSet) {
- throw new EvalException(
- loc,
- EvalUtils.getDataTypeName(x)
- + " is not iterable. You may use `len(<depset>.to_list())` instead. Use "
- + "--incompatible_depset_is_not_iterable=false to temporarily disable this "
- + "check.");
- }
- int l = EvalUtils.size(x);
- if (l == -1) {
+ if (x instanceof String) {
+ return ((String) x).length();
+ } else if (x instanceof Map) {
+ return ((Map<?, ?>) x).size();
+ } else if (x instanceof SkylarkList) {
+ return ((SkylarkList<?>) x).size();
+ } else if (x instanceof SkylarkNestedSet) {
+ if (env.getSemantics().incompatibleDepsetIsNotIterable()) {
+ throw new EvalException(
+ loc,
+ EvalUtils.getDataTypeName(x)
+ + " is not iterable. You may use `len(<depset>.to_list())` instead. Use "
+ + "--incompatible_depset_is_not_iterable=false to temporarily disable this "
+ + "check.");
+ }
+ return ((SkylarkNestedSet) x).toCollection().size();
+ } else if (x instanceof Iterable) {
+ // Iterables.size() checks if x is a Collection so it's efficient in that sense.
+ return Iterables.size((Iterable<?>) x);
+ } else {
throw new EvalException(loc, EvalUtils.getDataTypeName(x) + " is not iterable");
}
- return l;
}
};
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
index 404a960..eec32d1 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
@@ -18,7 +18,6 @@
import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
import static org.junit.Assert.fail;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.StructProvider;
@@ -58,18 +57,6 @@
assertThat(EvalUtils.toIterable("abc", null, null)).hasSize(3);
}
- @Test
- public void testSize() throws Exception {
- assertThat(EvalUtils.size("abc")).isEqualTo(3);
- assertThat(EvalUtils.size(ImmutableMap.of(1, 2, 3, 4))).isEqualTo(2);
- assertThat(EvalUtils.size(SkylarkList.Tuple.of(1, 2, 3))).isEqualTo(3);
- SkylarkNestedSet set = SkylarkNestedSet.of(
- Object.class,
- NestedSetBuilder.stableOrder().add(1).add(2).add(3).build());
- assertThat(EvalUtils.size(set)).isEqualTo(3);
- assertThat(EvalUtils.size(ImmutableList.of(1, 2, 3))).isEqualTo(3);
- }
-
/** MockClassA */
@SkylarkModule(name = "MockClassA", doc = "MockClassA")
public static class MockClassA {