aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar laurentlb <laurentlb@google.com>2018-03-21 15:39:11 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-21 15:40:11 -0700
commit76972e2e069436d222153c66618e10f9e26db331 (patch)
tree4b2225e23a1f4b7966440f6919205995581afc95 /src
parent9eea0f9a98c6bec344284bfecc7c91c9d8dd7715 (diff)
Introduce string.elem() method.
RELNOTES[NEW]: Strings have a new .elems() method, that provides an iterator on the characters of the string. PiperOrigin-RevId: 189980269
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java21
-rw-r--r--src/test/skylark/testdata/string_elems.sky13
2 files changed, 34 insertions, 0 deletions
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 59135375e4..9856c7a3a3 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
@@ -894,6 +894,27 @@ public class MethodLibrary {
}
};
+ @SkylarkSignature(
+ name = "elems",
+ objectType = StringModule.class,
+ returnType = SkylarkList.class,
+ doc =
+ "Returns an iterable value containing successive 1-element substrings of the string. "
+ + "Equivalent to <code>[s[i] for i in range(len(s))]</code>, except that the "
+ + "returned value might not be a list.",
+ parameters = {@Param(name = "self", type = String.class, doc = "This string.")}
+ )
+ private static final BuiltinFunction elems =
+ new BuiltinFunction("elems") {
+ public SkylarkList<String> invoke(String self) throws ConversionException {
+ ImmutableList.Builder<String> builder = new ImmutableList.Builder<>();
+ for (char c : self.toCharArray()) {
+ builder.add(String.valueOf(c));
+ }
+ return SkylarkList.createImmutable(builder.build());
+ }
+ };
+
@SkylarkSignature(name = "endswith", objectType = StringModule.class, returnType = Boolean.class,
doc = "Returns True if the string ends with <code>sub</code>, "
+ "otherwise False, optionally restricting to [<code>start</code>:<code>end</code>], "
diff --git a/src/test/skylark/testdata/string_elems.sky b/src/test/skylark/testdata/string_elems.sky
new file mode 100644
index 0000000000..3dbe724995
--- /dev/null
+++ b/src/test/skylark/testdata/string_elems.sky
@@ -0,0 +1,13 @@
+# string.elems
+assert_eq(list("abcd".elems()), ["a", "b", "c", "d"])
+
+assert_eq(len("aaa".elems()), 3)
+
+def test_iter():
+ i = 0
+ for c in "abcd".elems():
+ assert_eq(c, "abcd"[i])
+ i += 1
+ assert_eq(i, 4)
+
+test_iter()