Skip to content

Commit

Permalink
Allow map_each to return None in TemplateDict#add_joined (#17288)
Browse files Browse the repository at this point in the history
Mimics the behavior of `Args#add_all`'s `map_each` callback and can be used to skip over values.

Also improves the error message when the callback returns an unexpected type by including the value.

Closes #16924.

PiperOrigin-RevId: 493609265
Change-Id: Ia9e42dd7edc2928a9945ce647d638fcb94037bc8

Co-authored-by: Fabian Meumertzheim <fabian@meumertzhe.im>
  • Loading branch information
ShreeM01 and fmeum committed Jan 21, 2023
1 parent b194fd3 commit 403a84b
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,12 @@ public String getValue() throws EvalException {
/*kwargs=*/ ImmutableMap.of());
if (ret instanceof String) {
parts.add((String) ret);
continue;
} else if (ret != Starlark.NONE) {
throw Starlark.errorf(
"Function provided to map_each must return a String or None, but returned type "
+ "%s for key '%s' and value: %s",
Starlark.type(ret), getKey(), Starlark.repr(val));
}
throw Starlark.errorf(
"Function provided to map_each must return a String, but returned type %s for key:"
+ " %s",
Starlark.type(ret), getKey());
} catch (InterruptedException e) {
// Report the error to the user, but the stack trace is not of use to them
throw Starlark.errorf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,9 @@ public interface TemplateDictApi extends StarlarkValue {
named = true,
positional = false,
doc =
"A Starlark function accepting a single argument and returning a String. This"
+ " function is applied to each item of the depset specified in the"
+ " <code>values</code> parameter"),
"A Starlark function accepting a single argument and returning either a String or "
+ "<code>None</code>. This function is applied to each item of the depset "
+ "specified in the <code>values</code> parameter"),
@Param(
name = "uniquify",
named = true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3626,7 +3626,7 @@ public void testTemplateExpansionComputedSubstitution() throws Exception {
scratch.file(
"test/rules.bzl",
"def _artifact_to_basename(file):",
" return file.basename",
" return file.basename if file.basename != 'ignored.txt' else None",
"",
"def _undertest_impl(ctx):",
" template_dict = ctx.actions.template_dict()",
Expand Down Expand Up @@ -3656,7 +3656,7 @@ public void testTemplateExpansionComputedSubstitution() throws Exception {
"undertest_rule(",
" name = 'undertest',",
" template = ':template.txt',",
" srcs = ['foo.txt', 'bar.txt', 'baz.txt'],",
" srcs = ['foo.txt', 'bar.txt', 'baz.txt', 'ignored.txt'],",
")",
"testing_rule(",
" name = 'testing',",
Expand Down Expand Up @@ -3912,8 +3912,8 @@ public void testTemplateExpansionComputedSubstitutionMapEachBadReturnType() thro
assertThat(evalException)
.hasMessageThat()
.isEqualTo(
"Function provided to map_each must return a String, but returned type Label for key:"
+ " %files%");
"Function provided to map_each must return a String or None, but returned "
+ "type Label for key '%files%' and value: <source file test/template.txt>");
}

@Test
Expand Down

0 comments on commit 403a84b

Please sign in to comment.