Make strings not iterable
Fixes #5830
RELNOTES: Flip flag --incompatible_string_is_not_iterable (https://github.com/bazelbuild/bazel/issues/5830)
PiperOrigin-RevId: 225981394
diff --git a/site/docs/skylark/backward-compatibility.md b/site/docs/skylark/backward-compatibility.md
index 7e611ec..fd3c1c1 100644
--- a/site/docs/skylark/backward-compatibility.md
+++ b/site/docs/skylark/backward-compatibility.md
@@ -185,7 +185,7 @@
```
* Flag: `--incompatible_string_is_not_iterable`
-* Default: `false`
+* Default: `true`
* Tracking issue: [#5830](https://github.com/bazelbuild/bazel/issues/5830)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
index 008f892..6087eed 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -492,7 +492,7 @@
@Option(
name = "incompatible_string_is_not_iterable",
- defaultValue = "false",
+ defaultValue = "true",
documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
metadataTags = {
@@ -501,8 +501,7 @@
},
help =
"If set to true, iterating over a string will throw an error. String indexing and `len` "
- + "are still allowed."
- )
+ + "are still allowed.")
public boolean incompatibleStringIsNotIterable;
/** Used in an integration test to confirm that flags are visible to the interpreter. */
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
index ac3fa3a..d58fd2c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -230,7 +230,7 @@
.incompatibleRemoveNativeHttpArchive(true)
.incompatibleRemoveNativeMavenJar(false)
.incompatibleStricArgumentOrdering(false)
- .incompatibleStringIsNotIterable(false)
+ .incompatibleStringIsNotIterable(true)
.internalSkylarkFlagTestCanary(false)
.build();
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index cc6575a..e24d885 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -314,18 +314,12 @@
@Test
public void testNestedListComprehensions() throws Exception {
- newTest().testExactOrder("li = [[1, 2], [3, 4]]\n" + "[j for i in li for j in i]", 1, 2,
- 3, 4).testExactOrder("input = [['abc'], ['def', 'ghi']]\n"
- + "['%s %s' % (b, c) for a in input for b in a for c in b]",
- "abc a",
- "abc b",
- "abc c",
- "def d",
- "def e",
- "def f",
- "ghi g",
- "ghi h",
- "ghi i");
+ newTest()
+ .testExactOrder("li = [[1, 2], [3, 4]]\n" + "[j for i in li for j in i]", 1, 2, 3, 4)
+ .testExactOrder(
+ "input = [['abc'], ['def', 'ghi']]\n"
+ + "['%s %s' % (b, c) for a in input for b in a for c in b.elems()]",
+ "abc a", "abc b", "abc c", "def d", "def e", "def f", "ghi g", "ghi h", "ghi i");
}
@Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 04f20d8..6895268 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -693,12 +693,15 @@
@Test
public void testForOnString() throws Exception {
- new SkylarkTest().setUp("def foo():",
- " s = []",
- " for i in 'abc':",
- " s = s + [i]",
- " return s",
- "s = foo()").testExactOrder("s", "a", "b", "c");
+ new SkylarkTest("--incompatible_string_is_not_iterable=false")
+ .setUp(
+ "def foo():",
+ " s = []",
+ " for i in 'abc':",
+ " s = s + [i]",
+ " return s",
+ "s = foo()")
+ .testExactOrder("s", "a", "b", "c");
}
@Test
diff --git a/src/test/skylark/testdata/all_any.sky b/src/test/skylark/testdata/all_any.sky
index 1b37967..4b0f59e 100644
--- a/src/test/skylark/testdata/all_any.sky
+++ b/src/test/skylark/testdata/all_any.sky
@@ -1,9 +1,8 @@
# All with empty value
-assert_eq(all(''), True)
assert_eq(all([]), True)
# All with list
-assert_eq(all('test'), True)
+assert_eq(all(['t', 'e']), True)
assert_eq(all([False]), False)
assert_eq(all([True, False]), False)
assert_eq(all([False, False]), False)
@@ -18,11 +17,9 @@
assert_eq(all({None : 1}), False)
# Any with empty value
-assert_eq(any(''), False)
assert_eq(any([]), False)
# Any with list
-assert_eq(any('test'), True)
assert_eq(any([False]), False)
assert_eq(any([0]), False)
assert_eq(any(['']), False)
diff --git a/src/test/skylark/testdata/min_max.sky b/src/test/skylark/testdata/min_max.sky
index 0349d91..02f0474 100644
--- a/src/test/skylark/testdata/min_max.sky
+++ b/src/test/skylark/testdata/min_max.sky
@@ -1,6 +1,6 @@
# min / max
-assert_eq(min("abcdefxyz"), "a")
+assert_eq(min("abcdefxyz".elems()), "a")
assert_eq(min("test", "xyz"), "test")
assert_eq(min([4, 5], [1]), [1])
@@ -15,7 +15,7 @@
assert_eq(min(1, 1, 1, 1, 1, 1), 1)
assert_eq(min([1, 1, 1, 1, 1, 1]), 1)
-assert_eq(max("abcdefxyz"), "z")
+assert_eq(max("abcdefxyz".elems()), "z")
assert_eq(max("test", "xyz"), "xyz")
assert_eq(max("test", "xyz"), "xyz")
assert_eq(max([1, 2], [5]), [5])
diff --git a/src/test/skylark/testdata/reversed.sky b/src/test/skylark/testdata/reversed.sky
index 91ce565..08beba8 100644
--- a/src/test/skylark/testdata/reversed.sky
+++ b/src/test/skylark/testdata/reversed.sky
@@ -1,10 +1,10 @@
# lists
-assert_eq(reversed(''), [])
-assert_eq(reversed('a'), ['a'])
-assert_eq(reversed('abc'), ['c', 'b', 'a'])
-assert_eq(reversed('__test '), [' ', ' ', 't', 's', 'e', 't', '_', '_'])
-assert_eq(reversed('bbb'), ['b', 'b', 'b'])
+assert_eq(reversed([]), [])
+assert_eq(reversed('a'.elems()), ['a'])
+assert_eq(reversed('abc'.elems()), ['c', 'b', 'a'])
+assert_eq(reversed('__test '.elems()), [' ', ' ', 't', 's', 'e', 't', '_', '_'])
+assert_eq(reversed('bbb'.elems()), ['b', 'b', 'b'])
---
reversed(None) ### type 'NoneType' is not iterable
diff --git a/src/test/skylark/testdata/string_misc.sky b/src/test/skylark/testdata/string_misc.sky
index 87708f9..180295d 100644
--- a/src/test/skylark/testdata/string_misc.sky
+++ b/src/test/skylark/testdata/string_misc.sky
@@ -123,14 +123,6 @@
assert_eq('012345678'[-1:2], "")
assert_eq('012345678'[4:2], "")
-# reversed
-# to be removed, strings should not be iterable
-assert_eq(reversed(''), [])
-assert_eq(reversed('a'), ['a'])
-assert_eq(reversed('abc'), ['c', 'b', 'a'])
-assert_eq(reversed('__test '), [' ', ' ', 't', 's', 'e', 't', '_', '_'])
-assert_eq(reversed('bbb'), ['b', 'b', 'b'])
-
# count
assert_eq('abc'.count('a'), 1)
assert_eq('abc'.count('b'), 1)