diff --git a/src/main/java/com/google/devtools/build/lib/packages/Type.java b/src/main/java/com/google/devtools/build/lib/packages/Type.java index bd315476c857ba..08c3436f509dab 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Type.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Type.java @@ -732,6 +732,10 @@ public List convert(Object x, Object what, LabelConverter labelConverter) throws ConversionException { Iterable iterable; + if (x instanceof Map) { + throw new ConversionException(this, x, what); + } + if (x instanceof Iterable) { iterable = (Iterable) x; } else if (x instanceof Depset) { diff --git a/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java index a21ce45fea428a..8fcd90636c9711 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java @@ -289,6 +289,19 @@ public void testNonStringList() throws Exception { .isEqualTo("expected value of type 'list(string)' for blah, but got 3 (int)"); } + @Test + public void testStringListRejectsDict() throws Exception { + Type.ConversionException e = + assertThrows( + Type.ConversionException.class, + () -> Types.STRING_LIST.convert(ImmutableMap.of("foo", "bar"), "myattr")); + assertThat(e) + .hasMessageThat() + .isEqualTo( + "expected value of type 'list(string)' for myattr," + + " but got {\"foo\": \"bar\"} (Map)"); + } + @Test public void testStringListBadElements() throws Exception { Object input = Arrays.asList("foo", "bar", StarlarkInt.of(1));