Skip to content

Commit a87b8e0

Browse files
ShreeM01fmeumkeertk
authored
[6.2.0]Add support for alias targets to cquery's providers (bazelbuild#17786)
* Add support for alias targets to cquery's `providers` When applied to an `alias` target, the `providers` function of `cquery`'s `--output=starlark` mode now returns the providers of the aliased target rather than `None`. This is achieved by moving `getProvidersDict` from `AbstractConfiguredTarget` up to `ConfiguredTarget`. Fixes bazelbuild#17749 Closes bazelbuild#17753. PiperOrigin-RevId: 516707744 Change-Id: I840588d605e3a64b968a019cf4bf43b56d18f4f5 * Remove extra code --------- Co-authored-by: Fabian Meumertzheim <[email protected]> Co-authored-by: keertk <[email protected]>
1 parent 3a7236b commit a87b8e0

File tree

5 files changed

+48
-14
lines changed

5 files changed

+48
-14
lines changed

src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java

+10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.google.devtools.build.lib.cmdline.Label;
2121
import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
2222
import javax.annotation.Nullable;
23+
import net.starlark.java.eval.Dict;
2324
import net.starlark.java.eval.Structure;
2425

2526
/**
@@ -95,4 +96,13 @@ default Label getOriginalLabel() {
9596
default ImmutableMap<Label, ConfigMatchingProvider> getConfigConditions() {
9697
return ImmutableMap.of();
9798
}
99+
100+
/**
101+
* This is only intended to be called from the query dialects of Starlark.
102+
*
103+
* @return a map of provider names to their values
104+
*/
105+
default Dict<String, Object> getProvidersDict() {
106+
return null;
107+
}
98108
}

src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java

-9
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
3636
import java.util.function.Consumer;
3737
import javax.annotation.Nullable;
38-
import net.starlark.java.eval.Dict;
3938
import net.starlark.java.eval.EvalException;
4039
import net.starlark.java.eval.Printer;
4140
import net.starlark.java.eval.Starlark;
@@ -255,12 +254,4 @@ public String getRuleClassString() {
255254
public void repr(Printer printer) {
256255
printer.append("<unknown target " + getLabel() + ">");
257256
}
258-
259-
/**
260-
* Returns a map of provider names to their values. This is only intended to be called from the
261-
* query dialects of Starlark. Implement in subclasses which can have providers.
262-
*/
263-
public Dict<String, Object> getProvidersDict() {
264-
return null;
265-
}
266257
}

src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
2222
import com.google.devtools.build.lib.analysis.config.BuildOptions;
2323
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
24-
import com.google.devtools.build.lib.analysis.configuredtargets.AbstractConfiguredTarget;
2524
import com.google.devtools.build.lib.cmdline.Label;
2625
import com.google.devtools.build.lib.events.Event;
2726
import com.google.devtools.build.lib.events.ExtendedEventHandler;
@@ -121,10 +120,7 @@ public Object buildOptions(ConfiguredTarget target) {
121120
@Param(name = "target"),
122121
})
123122
public Object providers(ConfiguredTarget target) {
124-
if (!(target instanceof AbstractConfiguredTarget)) {
125-
return Starlark.NONE;
126-
}
127-
Dict<String, Object> ret = ((AbstractConfiguredTarget) target).getProvidersDict();
123+
Dict<String, Object> ret = target.getProvidersDict();
128124
if (ret == null) {
129125
return Starlark.NONE;
130126
}

src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java

+6
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.google.devtools.build.lib.packages.Provider;
3939
import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
4040
import javax.annotation.Nullable;
41+
import net.starlark.java.eval.Dict;
4142
import net.starlark.java.eval.EvalException;
4243
import net.starlark.java.eval.Printer;
4344
import net.starlark.java.eval.StarlarkSemantics;
@@ -196,6 +197,11 @@ public Label getOriginalLabel() {
196197
return label;
197198
}
198199

200+
@Override
201+
public Dict<String, Object> getProvidersDict() {
202+
return actual.getProvidersDict();
203+
}
204+
199205
@Override
200206
public void repr(Printer printer) {
201207
printer.append("<alias target " + label + " of " + actual.getLabel() + ">");

src/test/shell/integration/configured_query_test.sh

+31
Original file line numberDiff line numberDiff line change
@@ -1268,6 +1268,37 @@ EOF
12681268
assert_contains "some_value" output
12691269
}
12701270

1271+
function test_starlark_output_providers_starlark_provider_for_alias() {
1272+
local -r pkg=$FUNCNAME
1273+
mkdir -p $pkg
1274+
cat > $pkg/BUILD <<EOF
1275+
load(":my_rule.bzl", "my_rule")
1276+
my_rule(name="myrule")
1277+
alias(name="myalias", actual="myrule")
1278+
EOF
1279+
cat > $pkg/my_rule.bzl <<'EOF'
1280+
# A no-op rule that manifests a provider
1281+
MyRuleInfo = provider(fields={"label": "a_rule_label"})
1282+
1283+
def _my_rule_impl(ctx):
1284+
return [MyRuleInfo(label="some_value")]
1285+
1286+
my_rule = rule(
1287+
implementation = _my_rule_impl,
1288+
attrs = {},
1289+
)
1290+
EOF
1291+
cat > $pkg/outfunc.bzl <<EOF
1292+
def format(target):
1293+
p = providers(target)
1294+
return p["//$pkg:my_rule.bzl%MyRuleInfo"].label
1295+
EOF
1296+
bazel cquery "//$pkg:myalias" --output=starlark --starlark:file="$pkg/outfunc.bzl" >output \
1297+
2>"$TEST_log" || fail "Expected success"
1298+
1299+
assert_contains "some_value" output
1300+
}
1301+
12711302
function test_bazelignore_error_cquery_nocrash() {
12721303
local -r pkg=$FUNCNAME
12731304

0 commit comments

Comments
 (0)