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..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 @@ -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,13 @@ default Label getOriginalLabel() { default ImmutableMap getConfigConditions() { return ImmutableMap.of(); } + + /** + * 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