From 956ef1f3fc706c13e42d12c26f614bcd7ac23bc0 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Tue, 14 Mar 2023 20:30:40 -0700 Subject: [PATCH 1/2] 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 #17749 Closes #17753. PiperOrigin-RevId: 516707744 Change-Id: I840588d605e3a64b968a019cf4bf43b56d18f4f5 --- .../build/lib/analysis/ConfiguredTarget.java | 23 ++++++++++++++ .../AbstractConfiguredTarget.java | 9 ------ .../StarlarkOutputFormatterCallback.java | 6 +--- .../lib/rules/AliasConfiguredTarget.java | 6 ++++ .../integration/configured_query_test.sh | 31 +++++++++++++++++++ 5 files changed, 61 insertions(+), 14 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 c8c600ab4d557b..c853790e2a62db 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 @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.skyframe.BuildConfigurationKey; import javax.annotation.Nullable; +import net.starlark.java.eval.Dict; import net.starlark.java.eval.Structure; /** @@ -95,4 +96,26 @@ default Label getOriginalLabel() { default ImmutableMap getConfigConditions() { return ImmutableMap.of(); } + + default boolean isRuleConfiguredTarget() { + return false; + } + + /** + * The base configured target if it has been merged with aspects otherwise the current value. + * + *

Unwrapping is recursive if there are multiple layers. + */ + default ConfiguredTarget unwrapIfMerged() { + return this; + } + + /** + * This is only intended to be called from the query dialects of Starlark. + * + * @return a map of provider names to their values + */ + default Dict getProvidersDict() { + return null; + } } 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 e5156c1cf3eee5..0c3330d0f5586c 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 @@ -35,7 +35,6 @@ import com.google.devtools.build.lib.skyframe.BuildConfigurationKey; import java.util.function.Consumer; import javax.annotation.Nullable; -import net.starlark.java.eval.Dict; import net.starlark.java.eval.EvalException; import net.starlark.java.eval.Printer; import net.starlark.java.eval.Starlark; @@ -255,12 +254,4 @@ public String getRuleClassString() { public void repr(Printer printer) { printer.append(""); } - - /** - * Returns a map of provider names to their values. This is only intended to be called from the - * query dialects of Starlark. Implement in subclasses which can have providers. - */ - public Dict getProvidersDict() { - return null; - } } diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java index 267ec00df96c8b..d107529352ec4a 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java @@ -21,7 +21,6 @@ import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.FragmentOptions; -import com.google.devtools.build.lib.analysis.configuredtargets.AbstractConfiguredTarget; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler; @@ -121,10 +120,7 @@ public Object buildOptions(ConfiguredTarget target) { @Param(name = "target"), }) public Object providers(ConfiguredTarget target) { - if (!(target instanceof AbstractConfiguredTarget)) { - return Starlark.NONE; - } - Dict ret = ((AbstractConfiguredTarget) target).getProvidersDict(); + Dict ret = target.getProvidersDict(); if (ret == null) { return Starlark.NONE; } 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 b68e2fa9bcae57..6c3981cb2af9ab 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 @@ -38,6 +38,7 @@ import com.google.devtools.build.lib.packages.Provider; import com.google.devtools.build.lib.skyframe.BuildConfigurationKey; import javax.annotation.Nullable; +import net.starlark.java.eval.Dict; import net.starlark.java.eval.EvalException; import net.starlark.java.eval.Printer; import net.starlark.java.eval.StarlarkSemantics; @@ -196,6 +197,11 @@ public Label getOriginalLabel() { return label; } + @Override + public Dict getProvidersDict() { + return actual.getProvidersDict(); + } + @Override public void repr(Printer printer) { printer.append(""); diff --git a/src/test/shell/integration/configured_query_test.sh b/src/test/shell/integration/configured_query_test.sh index 1d80a9539e9c43..53106731086f02 100755 --- a/src/test/shell/integration/configured_query_test.sh +++ b/src/test/shell/integration/configured_query_test.sh @@ -1268,6 +1268,37 @@ EOF assert_contains "some_value" output } +function test_starlark_output_providers_starlark_provider_for_alias() { + local -r pkg=$FUNCNAME + mkdir -p $pkg + cat > $pkg/BUILD < $pkg/my_rule.bzl <<'EOF' +# A no-op rule that manifests a provider +MyRuleInfo = provider(fields={"label": "a_rule_label"}) + +def _my_rule_impl(ctx): + return [MyRuleInfo(label="some_value")] + +my_rule = rule( + implementation = _my_rule_impl, + attrs = {}, +) +EOF + cat > $pkg/outfunc.bzl <output \ + 2>"$TEST_log" || fail "Expected success" + + assert_contains "some_value" output +} + function test_bazelignore_error_cquery_nocrash() { local -r pkg=$FUNCNAME From ecc8a0eedd8aa7f1833cedfb0a0cd71c694e1453 Mon Sep 17 00:00:00 2001 From: keertk Date: Fri, 17 Mar 2023 17:13:13 -0700 Subject: [PATCH 2/2] Remove extra code --- .../build/lib/analysis/ConfiguredTarget.java | 13 ------------- 1 file changed, 13 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 c853790e2a62db..df3f79b7a524a1 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 @@ -97,19 +97,6 @@ default ImmutableMap getConfigConditions() { return ImmutableMap.of(); } - default boolean isRuleConfiguredTarget() { - return false; - } - - /** - * The base configured target if it has been merged with aspects otherwise the current value. - * - *

Unwrapping is recursive if there are multiple layers. - */ - default ConfiguredTarget unwrapIfMerged() { - return this; - } - /** * This is only intended to be called from the query dialects of Starlark. *