From 18ba53f84224f76fa140b1af12248b1d43f0e0e3 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Fri, 14 Apr 2023 16:16:51 +0200 Subject: [PATCH] Add `alias_label` struct field to all targets This allows rules to obtain the label of an `alias` target rather than only the label of the target an alias chain ultimately resolves to. The former is the label as specified by the user on the rule, which can be important to know for e.g. fixup messages and manual implementations of location expansion. --- .../build/lib/analysis/ConfiguredTarget.java | 3 ++ .../AbstractConfiguredTarget.java | 4 +++ .../lib/rules/AliasConfiguredTarget.java | 20 ++++++----- .../core/TransitiveInfoCollectionApi.java | 9 ++++- .../lib/starlark/StarlarkRuleContextTest.java | 33 +++++++++++++++++++ 5 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java index a53fea14973223..19da56f205364c 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java @@ -39,6 +39,9 @@ public interface ConfiguredTarget extends TransitiveInfoCollection, Structure { /** All ConfiguredTargets have a "label" field. */ String LABEL_FIELD = "label"; + /** All ConfiguredTargets have an "alias_label" field. */ + String ALIAS_LABEL_FIELD = "alias_label"; + /** All ConfiguredTargets have a "files" field. */ String FILES_FIELD = "files"; diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java index 0c3330d0f5586c..8d1515a651d5ab 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java @@ -66,6 +66,7 @@ public abstract class AbstractConfiguredTarget implements ConfiguredTarget, Visi // attributed to normal user-specified providers). private static final ImmutableSet SPECIAL_FIELD_NAMES = ImmutableSet.of( + ALIAS_LABEL_FIELD, LABEL_FIELD, FILES_FIELD, DEFAULT_RUNFILES_FIELD, @@ -141,6 +142,9 @@ public Object getValue(String name) { switch (name) { case LABEL_FIELD: return getLabel(); + case ALIAS_LABEL_FIELD: + // Overridden in AliasConfiguredTarget. + return Starlark.NONE; case ACTIONS_FIELD_NAME: // Depending on subclass, the 'actions' field will either be unsupported or of type // java.util.List, which needs to be converted to Sequence before being returned. diff --git a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java index 14711711471c24..ab4a9033169844 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java @@ -163,15 +163,19 @@ public BuildConfigurationKey getConfigurationKey() { @Override public Object getValue(String name) { - if (name.equals(LABEL_FIELD)) { - return getLabel(); - } else if (name.equals(FILES_FIELD)) { - // A shortcut for files to build in Starlark. FileConfiguredTarget and RuleConfiguredTarget - // always has FileProvider and Error- and PackageGroupConfiguredTarget-s shouldn't be - // accessible in Starlark. - return Depset.of(Artifact.class, getProvider(FileProvider.class).getFilesToBuild()); + switch (name) { + case LABEL_FIELD: + return getLabel(); + case ALIAS_LABEL_FIELD: + return getOriginalLabel(); + case FILES_FIELD: + // A shortcut for files to build in Starlark. FileConfiguredTarget and RuleConfiguredTarget + // always has FileProvider and Error- and PackageGroupConfiguredTarget-s shouldn't be + // accessible in Starlark. + return Depset.of(Artifact.class, getProvider(FileProvider.class).getFilesToBuild()); + default: + return actual.getValue(name); } - return actual.getValue(name); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/TransitiveInfoCollectionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/TransitiveInfoCollectionApi.java index 3b7485c5b79712..ecbe5312405939 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/TransitiveInfoCollectionApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/TransitiveInfoCollectionApi.java @@ -33,7 +33,14 @@ + "