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 ConfiguredTarget
s have a "label" field. */
String LABEL_FIELD = "label";
+ /** All ConfiguredTarget
s have an "alias_label" field. */
+ String ALIAS_LABEL_FIELD = "alias_label";
+
/** All ConfiguredTarget
s 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 @@
+ "\n" //
+ "label
\n" //
+ "Label Target.label
\n" //
- + "The identifier of the target. \n" //
+ + "The label of the target after following all alias
es.\n" //
+ //
+ + "\n" //
+ + "alias_label
\n" //
+ + "Label Target.alias_label
\n" //
+ + "The label of the target if it is an alias
, otherwise None
. \n" //
//
+ "files
\n" //
+ "depset Target.files
\n" //
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
index 4460e5d652e112..3dc2085e4075f1 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
@@ -4062,4 +4062,37 @@ public void testTemplateExpansionComputedSubstitutionMapEachMustBeTopLevel() thr
checkError("//test:testing", "must be declared by a top-level def statement");
}
+
+ @Test
+ public void testTargetAliasLabel() throws Exception {
+ scratch.file(
+ "test/rules.bzl",
+ "def _my_rule_impl(ctx):",
+ " direct_dep = ctx.attr.deps[0]",
+ " direct_dep.label == Label('//test:target') or fail()",
+ " direct_dep.alias_label == None or fail()",
+ " alias_dep = ctx.attr.deps[1]",
+ " alias_dep.label == Label('//test:target') or fail()",
+ " alias_dep.alias_label == Label('//test:alias') or fail()",
+ "my_rule = rule(",
+ " implementation = _my_rule_impl,",
+ " attrs = {'deps': attr.label_list()},",
+ ")");
+ scratch.file(
+ "test/BUILD",
+ "load(':rules.bzl', 'my_rule')",
+ "my_rule(",
+ " name = 'my_rule',",
+ " deps = [",
+ " ':target',",
+ " ':alias',",
+ " ],",
+ ")",
+ "",
+ "cc_binary(name = 'target')",
+ "alias(name = 'alias', actual = ':further_alias')",
+ "alias(name = 'further_alias', actual = ':target')");
+
+ getConfiguredTarget("//test:my_rule");
+ }
}