New flag --incompatible_no_attr_license to disable `attr.license` function
#6420
RELNOTES:
The function `attr.license` is deprecated and will be removed.
It can be disabled now with `--incompatible_no_attr_license`.
PiperOrigin-RevId: 218910996
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
index 223285b..c1c91a8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -355,6 +355,18 @@
public boolean incompatibleNewActionsApi;
@Option(
+ name = "incompatible_no_attr_license",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
+ effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
+ metadataTags = {
+ OptionMetadataTag.INCOMPATIBLE_CHANGE,
+ OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+ },
+ help = "If set to true, disables the function `attr.license`.")
+ public boolean incompatibleNoAttrLicense;
+
+ @Option(
name = "incompatible_no_output_attr_default",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
@@ -531,6 +543,7 @@
.incompatibleExpandDirectories(incompatibleExpandDirectories)
.incompatibleGenerateJavaCommonSourceJar(incompatibleGenerateJavaCommonSourceJar)
.incompatibleNewActionsApi(incompatibleNewActionsApi)
+ .incompatibleNoAttrLicense(incompatibleNoAttrLicense)
.incompatibleNoOutputAttrDefault(incompatibleNoOutputAttrDefault)
.incompatibleNoSupportToolsInActionInputs(incompatibleNoSupportToolsInActionInputs)
.incompatibleNoTargetOutputGroup(incompatibleNoTargetOutputGroup)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java
index b688d70..8b44f65e 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java
@@ -26,6 +26,7 @@
import com.google.devtools.build.lib.syntax.FuncallExpression;
import com.google.devtools.build.lib.syntax.SkylarkDict;
import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
import com.google.devtools.build.lib.syntax.UserDefinedFunction;
/**
@@ -979,6 +980,7 @@
positional = false,
doc = MANDATORY_DOC)
},
+ disableWithFlag = FlagIdentifier.INCOMPATIBLE_NO_ATTR_LICENSE,
useAst = true,
useEnvironment = true)
public Descriptor licenseAttribute(
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
index f09875c..5af8f65 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -48,6 +48,7 @@
SkylarkSemantics::incompatibleDisableObjcProviderResources),
INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP(
SkylarkSemantics::incompatibleNoTargetOutputGroup),
+ INCOMPATIBLE_NO_ATTR_LICENSE(SkylarkSemantics::incompatibleNoAttrLicense),
NONE(null);
// Using a Function here makes the enum definitions far cleaner, and, since this is
@@ -152,6 +153,8 @@
public abstract boolean incompatibleNewActionsApi();
+ public abstract boolean incompatibleNoAttrLicense();
+
public abstract boolean incompatibleNoOutputAttrDefault();
public abstract boolean incompatibleNoSupportToolsInActionInputs();
@@ -212,6 +215,7 @@
.incompatibleExpandDirectories(false)
.incompatibleGenerateJavaCommonSourceJar(false)
.incompatibleNewActionsApi(false)
+ .incompatibleNoAttrLicense(false)
.incompatibleNoOutputAttrDefault(false)
.incompatibleNoSupportToolsInActionInputs(false)
.incompatibleNoTargetOutputGroup(false)
@@ -276,6 +280,8 @@
public abstract Builder incompatibleNewActionsApi(boolean value);
+ public abstract Builder incompatibleNoAttrLicense(boolean value);
+
public abstract Builder incompatibleNoOutputAttrDefault(boolean value);
public abstract Builder incompatibleNoSupportToolsInActionInputs(boolean value);
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 9360d94..7fcda27 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
@@ -144,6 +144,7 @@
"--incompatible_expand_directories=" + rand.nextBoolean(),
"--incompatible_generate_javacommon_source_jar=" + rand.nextBoolean(),
"--incompatible_new_actions_api=" + rand.nextBoolean(),
+ "--incompatible_no_attr_license=" + rand.nextBoolean(),
"--incompatible_no_output_attr_default=" + rand.nextBoolean(),
"--incompatible_no_support_tools_in_action_inputs=" + rand.nextBoolean(),
"--incompatible_no_target_output_group=" + rand.nextBoolean(),
@@ -188,6 +189,7 @@
.incompatibleExpandDirectories(rand.nextBoolean())
.incompatibleGenerateJavaCommonSourceJar(rand.nextBoolean())
.incompatibleNewActionsApi(rand.nextBoolean())
+ .incompatibleNoAttrLicense(rand.nextBoolean())
.incompatibleNoOutputAttrDefault(rand.nextBoolean())
.incompatibleNoSupportToolsInActionInputs(rand.nextBoolean())
.incompatibleNoTargetOutputGroup(rand.nextBoolean())
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 3337f07..69511a0 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
@@ -644,6 +644,19 @@
}
@Test
+ public void testNoAttrLicense() throws Exception {
+ ev =
+ createEvaluationTestCase(
+ SkylarkSemantics.DEFAULT_SEMANTICS.toBuilder().incompatibleNoAttrLicense(true).build());
+ ev.initialize();
+
+ EvalException expected = assertThrows(EvalException.class, () -> eval("attr.license()"));
+ assertThat(expected)
+ .hasMessageThat()
+ .contains("type 'attr (a language module)' has no method license()");
+ }
+
+ @Test
public void testAttrDocValueBadType() throws Exception {
checkErrorContains(
"expected value of type 'string' for parameter 'doc', "