diff options
author | 2018-03-21 15:39:11 -0700 | |
---|---|---|
committer | 2018-03-21 15:40:11 -0700 | |
commit | 76972e2e069436d222153c66618e10f9e26db331 (patch) | |
tree | 4b2225e23a1f4b7966440f6919205995581afc95 /src | |
parent | 9eea0f9a98c6bec344284bfecc7c91c9d8dd7715 (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.java | 21 | ||||
-rw-r--r-- | src/test/skylark/testdata/string_elems.sky | 13 |
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() |