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 ede0f62043c40f..b7084fa0edfd86 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 @@ -561,11 +561,11 @@ public Map convert(Object x, Object what, Object context) @Override public Map concat(Iterable> iterable) { - ImmutableMap.Builder output = ImmutableMap.builder(); + LinkedHashMap output = new LinkedHashMap<>(); for (Map map: iterable){ output.putAll(map); } - return output.build(); + return ImmutableMap.copyOf(output); } @Override diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurableAttributesTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurableAttributesTest.java index 0bc023a8e7a7d4..f4b6cd75ed9e8e 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurableAttributesTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurableAttributesTest.java @@ -968,6 +968,50 @@ public void selectConcatenatedWithSelect() throws Exception { /*not expected:*/ ImmutableList.of("bin java/foo/liba.jar", "bin java/foo/liba2.jar")); } + @Test + public void dictsWithSameKey() throws Exception { + writeConfigRules(); + scratch.file("java/foo/rule.bzl", + "def _rule_impl(ctx):", + " outputs = []", + " for target, value in ctx.attr.deps.items():", + " output = ctx.actions.declare_file(target.label.name + value)", + " ctx.actions.write(content = value, output = output)", + " outputs.append(output)", + " return [DefaultInfo(files=depset(outputs))]", + "myrule = rule(", + " implementation = _rule_impl,", + " attrs = {", + " 'deps': attr.label_keyed_string_dict()", + " },", + ")"); + scratch.file("java/foo/BUILD", + "load(':rule.bzl', 'myrule')", + "myrule(", + " name = 'mytarget',", + " deps = select({", + " '//conditions:a': {':a': 'a'},", + " }) | select({", + " '//conditions:a': {':a': 'a2'},", + " })", + ")", + "java_library(", + " name = 'a',", + " srcs = ['a.java']", + ")", + "filegroup(", + " name = 'group',", + " srcs = [':mytarget'],", + ")"); + + checkRule( + "//java/foo:group", + "srcs", + ImmutableList.of("--foo=a"), + /*expected:*/ ImmutableList.of("bin java/foo/aa2"), + /*not expected:*/ ImmutableList.of("bin java/foo/aa")); + } + @Test public void selectConcatenatedWithNonSupportingType() throws Exception { writeConfigRules();