Disallow field syntax to access a target's providers
The provider-key syntax should be used instead.
This is an incompatible change attached to new flag --incompatible_disable_target_provider_fields.
See https://github.com/bazelbuild/bazel/issues/9014 for details.
RELNOTES: New incompatible flag --incompatible_disable_target_provider_fields removes the ability (in Starlark) to access a target's providers via the field syntax (for example, `ctx.attr.dep.my_provider`). The provider-key syntax should be used instead (for example, `ctx.attr.dep[MyProvider]`). See https://github.com/bazelbuild/bazel/issues/9014 for details.
PiperOrigin-RevId: 260920114
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index e77ed2d..a154354 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -138,6 +138,7 @@
"--incompatible_depset_for_libraries_to_link_getter=" + rand.nextBoolean(),
"--incompatible_depset_is_not_iterable=" + rand.nextBoolean(),
"--incompatible_depset_union=" + rand.nextBoolean(),
+ "--incompatible_disable_target_provider_fields=" + rand.nextBoolean(),
"--incompatible_disable_deprecated_attr_params=" + rand.nextBoolean(),
"--incompatible_disable_objc_provider_resources=" + rand.nextBoolean(),
"--incompatible_disable_third_party_license_checking=" + rand.nextBoolean(),
@@ -196,6 +197,7 @@
.incompatibleDepsetForLibrariesToLinkGetter(rand.nextBoolean())
.incompatibleDepsetIsNotIterable(rand.nextBoolean())
.incompatibleDepsetUnion(rand.nextBoolean())
+ .incompatibleDisableTargetProviderFields(rand.nextBoolean())
.incompatibleDisableDeprecatedAttrParams(rand.nextBoolean())
.incompatibleDisableObjcProviderResources(rand.nextBoolean())
.incompatibleDisableThirdPartyLicenseChecking(rand.nextBoolean())
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index 38f7a3a..11b0f10 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -2909,6 +2909,98 @@
}
@Test
+ public void testDisableTargetProviderFields() throws Exception {
+ setSkylarkSemanticsOptions("--incompatible_disable_target_provider_fields=true");
+ scratch.file(
+ "test/skylark/rule.bzl",
+ "MyProvider = provider()",
+ "",
+ "def _my_rule_impl(ctx): ",
+ " print(ctx.attr.dep.my_info)",
+ "def _dep_rule_impl(ctx): ",
+ " my_info = MyProvider(foo = 'bar')",
+ " return struct(my_info = my_info, providers = [my_info])",
+ "my_rule = rule(",
+ " implementation = _my_rule_impl,",
+ " attrs = {",
+ " 'dep': attr.label(),",
+ " })",
+ "dep_rule = rule(implementation = _dep_rule_impl)");
+ scratch.file(
+ "test/skylark/BUILD",
+ "load(':rule.bzl', 'my_rule', 'dep_rule')",
+ "",
+ "my_rule(name = 'r', dep = ':d')",
+ "dep_rule(name = 'd')");
+
+ reporter.removeHandler(failFastHandler);
+ getConfiguredTarget("//test/skylark:r");
+ assertContainsEvent(
+ "Accessing providers via the field syntax on structs is deprecated and will be removed "
+ + "soon. It may be temporarily re-enabled by setting "
+ + "--incompatible_disable_target_provider_fields=false. "
+ + "See https://github.com/bazelbuild/bazel/issues/9014 for details.");
+ }
+
+ // Verifies that non-provider fields on the 'target' type are still available even with
+ // --incompatible_disable_target_provider_fields.
+ @Test
+ public void testDisableTargetProviderFields_actionsField() throws Exception {
+ setSkylarkSemanticsOptions("--incompatible_disable_target_provider_fields=true");
+ scratch.file(
+ "test/skylark/rule.bzl",
+ "MyProvider = provider()",
+ "",
+ "def _my_rule_impl(ctx): ",
+ " print(ctx.attr.dep.actions)",
+ "def _dep_rule_impl(ctx): ",
+ " my_info = MyProvider(foo = 'bar')",
+ " return struct(my_info = my_info, providers = [my_info])",
+ "my_rule = rule(",
+ " implementation = _my_rule_impl,",
+ " attrs = {",
+ " 'dep': attr.label(),",
+ " })",
+ "dep_rule = rule(implementation = _dep_rule_impl)");
+ scratch.file(
+ "test/skylark/BUILD",
+ "load(':rule.bzl', 'my_rule', 'dep_rule')",
+ "",
+ "my_rule(name = 'r', dep = ':d')",
+ "dep_rule(name = 'd')");
+
+ assertThat(getConfiguredTarget("//test/skylark:r")).isNotNull();
+ }
+
+ @Test
+ public void testDisableTargetProviderFields_disabled() throws Exception {
+ setSkylarkSemanticsOptions("--incompatible_disable_target_provider_fields=false");
+ scratch.file(
+ "test/skylark/rule.bzl",
+ "MyProvider = provider()",
+ "",
+ "def _my_rule_impl(ctx): ",
+ " print(ctx.attr.dep.my_info)",
+ "def _dep_rule_impl(ctx): ",
+ " my_info = MyProvider(foo = 'bar')",
+ " return struct(my_info = my_info, providers = [my_info])",
+ "my_rule = rule(",
+ " implementation = _my_rule_impl,",
+ " attrs = {",
+ " 'dep': attr.label(),",
+ " })",
+ "dep_rule = rule(implementation = _dep_rule_impl)");
+ scratch.file(
+ "test/skylark/BUILD",
+ "load(':rule.bzl', 'my_rule', 'dep_rule')",
+ "",
+ "my_rule(name = 'r', dep = ':d')",
+ "dep_rule(name = 'd')");
+
+ assertThat(getConfiguredTarget("//test/skylark:r")).isNotNull();
+ }
+
+ @Test
public void testNoRuleOutputsParam() throws Exception {
setSkylarkSemanticsOptions("--incompatible_no_rule_outputs_param=true");
scratch.file(