Improve error message for the 'in' operator.
In particular, display the type that was passed as argument.
--
PiperOrigin-RevId: 148995695
MOS_MIGRATED_REVID=148995695
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
index 0da5e5c..e6d3790 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
@@ -77,11 +77,18 @@
return ((String) rval).contains((String) lval);
} else {
throw new EvalException(
- location, "in operator only works on strings if the left operand is also a string");
+ location,
+ "'in <string>' requires string as left operand, not '"
+ + EvalUtils.getDataTypeName(lval)
+ + "'");
}
} else {
throw new EvalException(
- location, "in operator only works on lists, tuples, sets, dicts and strings");
+ location,
+ "argument of type '"
+ + EvalUtils.getDataTypeName(rval)
+ + "' is not iterable. "
+ + "in operator only works on lists, tuples, dicts and strings.");
}
}
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 f217591..0f2a2cb 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
@@ -673,10 +673,9 @@
@Test
public void testInFail() throws Exception {
newTest()
- .testIfExactError(
- "in operator only works on strings if the left operand is also a string", "1 in '123'")
- .testIfExactError(
- "in operator only works on lists, tuples, sets, dicts and strings", "'a' in 1");
+ .testIfErrorContains(
+ "'in <string>' requires string as left operand, not 'int'", "1 in '123'")
+ .testIfErrorContains("'int' is not iterable. in operator only works on ", "'a' in 1");
}
@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 6353c12..a72f5e5 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
@@ -1243,15 +1243,6 @@
@Override
@Test
- public void testInFail() throws Exception {
- new SkylarkTest().testIfExactError(
- "in operator only works on strings if the left operand is also a string", "1 in '123'");
- new SkylarkTest().testIfExactError(
- "in operator only works on lists, tuples, sets, dicts and strings", "'a' in 1");
- }
-
- @Override
- @Test
public void testListComprehensionsMultipleVariablesFail() throws Exception {
new SkylarkTest()
.testIfErrorContains(