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(