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(