Provide label of the toolchain in `ToolchainAspectsProviders` PiperOrigin-RevId: 690667496 Change-Id: Ice3cfd5f27ed0f94979cb642dffa56ef2a2dc4a9
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectBaseTargetResolvedToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectBaseTargetResolvedToolchainContext.java index 3fb9985..9a8482c 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AspectBaseTargetResolvedToolchainContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectBaseTargetResolvedToolchainContext.java
@@ -16,6 +16,7 @@ import com.google.auto.value.AutoValue; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Iterables; @@ -32,6 +33,7 @@ import net.starlark.java.eval.Starlark; import net.starlark.java.eval.StarlarkIndexable; import net.starlark.java.eval.StarlarkSemantics; +import net.starlark.java.eval.Structure; /** * A toolchain context for the aspect's base target toolchains. It is used to represent the result @@ -105,7 +107,7 @@ * target toolchains. */ public static class ToolchainAspectsProviders - implements StarlarkIndexable, ResolvedToolchainData { + implements StarlarkIndexable, Structure, ResolvedToolchainData { private final TransitiveInfoProviderMap aspectsProviders; private final Label label; @@ -155,5 +157,26 @@ public void repr(Printer printer) { printer.append("<ToolchainAspectsProviders for toolchain target: " + label + ">"); } + + @Nullable + @Override + public Object getValue(String name) { + if (name.equals(MergedConfiguredTarget.LABEL_FIELD)) { + return label; + } + return null; + } + + @Override + public ImmutableList<String> getFieldNames() { + return ImmutableList.of(MergedConfiguredTarget.LABEL_FIELD); + } + + @Nullable + @Override + public String getErrorMessageForUnknownField(String field) { + // Use the default error message. + return null; + } } }
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkAspectsToolchainPropagationTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkAspectsToolchainPropagationTest.java index f6cac3a..1d2da7f 100644 --- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkAspectsToolchainPropagationTest.java +++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkAspectsToolchainPropagationTest.java
@@ -2218,6 +2218,56 @@ + " exec_platform: //platforms:platform_2"); } + @Test + public void aspectPropagatesToToolchain_seesToolchainLabel(@TestParameter boolean autoExecGroups) + throws Exception { + scratch.file( + "test/defs.bzl", + """ + AspectProvider = provider() + def _impl(target, ctx): + if ctx.rule.toolchains and '//rule:toolchain_type_1' in ctx.rule.toolchains: + return [ + AspectProvider(value = str(target.label) + ' has toolchain ' + + str(ctx.rule.toolchains['//rule:toolchain_type_1'].label))] + return [] + + toolchain_aspect = aspect( + implementation = _impl, + toolchains_aspects = ['//rule:toolchain_type_1'], + ) + + def _rule_impl(ctx): + pass + + r1 = rule( + implementation = _rule_impl, + toolchains = ['//rule:toolchain_type_1'], + ) + """); + scratch.file( + "test/BUILD", + """ + load('//test:defs.bzl', 'r1') + r1(name = 't1') + """); + useConfiguration( + "--extra_toolchains=//toolchain:foo_toolchain", + "--incompatible_auto_exec_groups=" + autoExecGroups); + + var analysisResult = update(ImmutableList.of("//test:defs.bzl%toolchain_aspect"), "//test:t1"); + + ConfiguredAspect configuredAspect = + Iterables.getOnlyElement(analysisResult.getAspectsMap().values()); + + StarlarkProvider.Key providerKey = + new StarlarkProvider.Key( + keyForBuild(Label.parseCanonical("//test:defs.bzl")), "AspectProvider"); + + var value = ((StarlarkInfo) configuredAspect.get(providerKey)).getValue("value"); + assertThat((String) value).isEqualTo("@@//test:t1 has toolchain @@//toolchain:foo"); + } + private ImmutableList<ConfiguredTargetKey> getConfiguredTargetKey(String targetLabel) { return skyframeExecutor.getEvaluator().getInMemoryGraph().getAllNodeEntries().stream() .filter(n -> isConfiguredTarget(n.getKey(), targetLabel))