Introduce flag --incompatible_restrict_attribute_names
When the flag is enabled, attribute names must be syntactically valid identifiers. For example, they cannot contain special characters.
Fixes https://github.com/bazelbuild/bazel/issues/6437
RELNOTES: Attribute names are going to be restricted and must be syntactically valid identifiers. https://github.com/bazelbuild/bazel/issues/6437
PiperOrigin-RevId: 255986287
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 91b5427..54ca283 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -198,6 +198,46 @@
}
@Test
+ public void testAttrNameSpecialCharactersAreForbidden() throws Exception {
+ ev =
+ createEvaluationTestCase(
+ StarlarkSemantics.DEFAULT_SEMANTICS.toBuilder()
+ .incompatibleRestrictAttributeNames(true)
+ .build());
+ ev.initialize();
+
+ ev.setFailFast(false);
+ evalAndExport("def impl(ctx): return", "r = rule(impl, attrs = {'ab$c': attr.int()})");
+ ev.assertContainsError("attribute name `ab$c` is not a valid identfier");
+ }
+
+ @Test
+ public void testAttrNameCannotStartWithDigit() throws Exception {
+ ev =
+ createEvaluationTestCase(
+ StarlarkSemantics.DEFAULT_SEMANTICS.toBuilder()
+ .incompatibleRestrictAttributeNames(true)
+ .build());
+ ev.initialize();
+
+ ev.setFailFast(false);
+ evalAndExport("def impl(ctx): return", "r = rule(impl, attrs = {'2_foo': attr.int()})");
+ ev.assertContainsError("attribute name `2_foo` is not a valid identfier");
+ }
+
+ @Test
+ public void testAttrNameSpecialCharactersLegacy() throws Exception {
+ ev =
+ createEvaluationTestCase(
+ StarlarkSemantics.DEFAULT_SEMANTICS.toBuilder()
+ .incompatibleRestrictAttributeNames(false)
+ .build());
+ ev.initialize();
+
+ evalAndExport("def impl(ctx): return", "r = rule(impl, attrs = {'ab$c': attr.int()})");
+ }
+
+ @Test
public void testDisableDeprecatedParams() throws Exception {
ev =
createEvaluationTestCase(