bazel syntax: improve error message This change is part of a demonstration of the workflow of making changes to Bazel. RELNOTES: N/A PiperOrigin-RevId: 302101199
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java index 4e9f449..9dd9b03 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
@@ -668,21 +668,19 @@ return ImmutableMap.of(); } if (!(obj instanceof Map<?, ?>)) { - throw Starlark.errorf( - "expected a dictionary for '%s' but got '%s' instead", - what, EvalUtils.getDataTypeName(obj)); + throw Starlark.errorf("got '%s' for '%s', want 'dict'", EvalUtils.getDataTypeName(obj), what); } for (Map.Entry<?, ?> input : ((Map<?, ?>) obj).entrySet()) { if (!keyType.isAssignableFrom(input.getKey().getClass()) || !valueType.isAssignableFrom(input.getValue().getClass())) { throw Starlark.errorf( - "expected <%s, %s> type for '%s' but got <%s, %s> instead", - keyType.getSimpleName(), - valueType.getSimpleName(), + "got dict<%s, %s> for '%s', want dict<%s, %s>", + Starlark.type(input.getKey()), + Starlark.type(input.getValue()), what, - EvalUtils.getDataTypeName(input.getKey()), - EvalUtils.getDataTypeName(input.getValue())); + EvalUtils.getDataTypeNameFromClass(keyType), + EvalUtils.getDataTypeNameFromClass(valueType)); } }
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java index 232e18b..7728813 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -832,7 +832,7 @@ public void testRuleBadTypeInAdd() throws Exception { registerDummyStarlarkFunction(); checkEvalErrorContains( - "expected <String, Descriptor> type for 'attrs' but got <string, string> instead", + "got dict<string, string> for 'attrs', want dict<string, Attribute>", "rule(impl, attrs = {'a1': 'some text'})"); }