Add --incompatible_disable_deprecated_attr_params to disable some deprecated parameters of the skylark attr module.
RELNOTES: None.
PiperOrigin-RevId: 204797954
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
index 0d1a1aa..a0cf36d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
@@ -147,8 +147,15 @@
builder.setPropertyFlag("MANDATORY");
}
- // TODO(laurentlb): Deprecated, remove in August 2016 (use allow_empty instead).
- if (containsNonNoneKey(arguments, NON_EMPTY_ARG) && (Boolean) arguments.get(NON_EMPTY_ARG)) {
+ if (containsNonNoneKey(arguments, NON_EMPTY_ARG)
+ && (Boolean) arguments.get(NON_EMPTY_ARG)) {
+ if (env.getSemantics().incompatibleDisableDeprecatedAttrParams()) {
+ throw new EvalException(ast.getLocation(),
+ "'non_empty' is no longer supported. use allow_empty instead. You can use "
+ + "--incompatible_disable_deprecated_attr_params to temporarily disable this "
+ + "check.");
+ }
+
builder.setPropertyFlag("NON_EMPTY");
}
@@ -168,14 +175,21 @@
}
}
- // TODO(laurentlb): Deprecated, remove in August 2016 (use allow_single_file).
if (containsNonNoneKey(arguments, SINGLE_FILE_ARG)
&& (Boolean) arguments.get(SINGLE_FILE_ARG)) {
+ if (env.getSemantics().incompatibleDisableDeprecatedAttrParams()) {
+ throw new EvalException(
+ ast.getLocation(),
+ "'single_file' is no longer supported. use allow_single_file instead. You can use "
+ + "--incompatible_disable_deprecated_attr_params to temporarily disable this "
+ + "check.");
+ }
if (containsNonNoneKey(arguments, ALLOW_SINGLE_FILE_ARG)) {
throw new EvalException(
ast.getLocation(),
"Cannot specify both single_file (deprecated) and allow_single_file");
}
+
builder.setPropertyFlag("SINGLE_ARTIFACT");
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
index 7f147cb..a8647a8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
@@ -47,6 +47,7 @@
codedOut.writeBoolNoTag(semantics.incompatibleBzlDisallowLoadAfterStatement());
codedOut.writeBoolNoTag(semantics.incompatibleDepsetIsNotIterable());
codedOut.writeBoolNoTag(semantics.incompatibleDepsetUnion());
+ codedOut.writeBoolNoTag(semantics.incompatibleDisableDeprecatedAttrParams());
codedOut.writeBoolNoTag(semantics.incompatibleDisableObjcProviderResources());
codedOut.writeBoolNoTag(semantics.incompatibleDisallowDataTransition());
codedOut.writeBoolNoTag(semantics.incompatibleDisallowDictPlus());
@@ -74,6 +75,7 @@
builder.incompatibleBzlDisallowLoadAfterStatement(codedIn.readBool());
builder.incompatibleDepsetIsNotIterable(codedIn.readBool());
builder.incompatibleDepsetUnion(codedIn.readBool());
+ builder.incompatibleDisableDeprecatedAttrParams(codedIn.readBool());
builder.incompatibleDisableObjcProviderResources(codedIn.readBool());
builder.incompatibleDisallowDataTransition(codedIn.readBool());
builder.incompatibleDisallowDictPlus(codedIn.readBool());
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 8781bb5..0798968 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
@@ -115,6 +115,21 @@
public boolean incompatibleDepsetIsNotIterable;
@Option(
+ name = "incompatible_disable_deprecated_attr_params",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+ effectTags = {OptionEffectTag.UNKNOWN},
+ metadataTags = {
+ OptionMetadataTag.INCOMPATIBLE_CHANGE,
+ OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+ },
+ help =
+ "If set to true, disable the deprecated parameters 'single_file' and 'non_empty' on "
+ + "skylark attribute definition methods, such as attr.label()."
+ )
+ public boolean incompatibleDisableDeprecatedAttrParams;
+
+ @Option(
name = "incompatible_disable_objc_provider_resources",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
@@ -327,6 +342,7 @@
.incompatibleBzlDisallowLoadAfterStatement(incompatibleBzlDisallowLoadAfterStatement)
.incompatibleDepsetIsNotIterable(incompatibleDepsetIsNotIterable)
.incompatibleDepsetUnion(incompatibleDepsetUnion)
+ .incompatibleDisableDeprecatedAttrParams(incompatibleDisableDeprecatedAttrParams)
.incompatibleDisableObjcProviderResources(incompatibleDisableObjcProviderResources)
.incompatibleDisallowDataTransition(incompatibleDisallowDataTransition)
.incompatibleDisallowDictPlus(incompatibleDisallowDictPlus)
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 5bd711b..fc7afa4 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
@@ -47,6 +47,8 @@
public abstract boolean incompatibleDepsetUnion();
+ public abstract boolean incompatibleDisableDeprecatedAttrParams();
+
public abstract boolean incompatibleDisableObjcProviderResources();
public abstract boolean incompatibleDisallowDataTransition();
@@ -96,6 +98,7 @@
.incompatibleBzlDisallowLoadAfterStatement(false)
.incompatibleDepsetIsNotIterable(false)
.incompatibleDepsetUnion(false)
+ .incompatibleDisableDeprecatedAttrParams(false)
.incompatibleDisableObjcProviderResources(false)
.incompatibleDisallowDataTransition(false)
.incompatibleDisallowDictPlus(false)
@@ -126,6 +129,8 @@
public abstract Builder incompatibleDepsetUnion(boolean value);
+ public abstract Builder incompatibleDisableDeprecatedAttrParams(boolean value);
+
public abstract Builder incompatibleDisableObjcProviderResources(boolean value);
public abstract Builder incompatibleDisallowDataTransition(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 4a8e303..a96d928 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
@@ -123,6 +123,7 @@
"--incompatible_bzl_disallow_load_after_statement=" + rand.nextBoolean(),
"--incompatible_depset_is_not_iterable=" + rand.nextBoolean(),
"--incompatible_depset_union=" + rand.nextBoolean(),
+ "--incompatible_disable_deprecated_attr_params=" + rand.nextBoolean(),
"--incompatible_disable_objc_provider_resources=" + rand.nextBoolean(),
"--incompatible_disallow_data_transition=" + rand.nextBoolean(),
"--incompatible_disallow_dict_plus=" + rand.nextBoolean(),
@@ -151,6 +152,7 @@
.incompatibleBzlDisallowLoadAfterStatement(rand.nextBoolean())
.incompatibleDepsetIsNotIterable(rand.nextBoolean())
.incompatibleDepsetUnion(rand.nextBoolean())
+ .incompatibleDisableDeprecatedAttrParams(rand.nextBoolean())
.incompatibleDisableObjcProviderResources(rand.nextBoolean())
.incompatibleDisallowDataTransition(rand.nextBoolean())
.incompatibleDisallowDictPlus(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 14d4de5..5378df2 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
@@ -199,6 +199,32 @@
}
@Test
+ public void testDisableDeprecatedParams() throws Exception {
+ ev = createEvaluationTestCase(
+ SkylarkSemantics.DEFAULT_SEMANTICS
+ .toBuilder()
+ .incompatibleDisableDeprecatedAttrParams(true)
+ .build());
+ ev.initialize();
+
+ // Verify 'single_file' deprecation.
+ EvalException expected =
+ assertThrows(EvalException.class, () -> eval("attr.label(single_file = True)"));
+ assertThat(expected).hasMessageThat().contains(
+ "'single_file' is no longer supported. use allow_single_file instead.");
+ Attribute attr = buildAttribute("a1", "attr.label(allow_single_file = ['.xml'])");
+ assertThat(attr.isSingleArtifact()).isTrue();
+
+ // Verify 'non_empty' deprecation.
+ expected =
+ assertThrows(EvalException.class, () -> eval("attr.string_list(non_empty=True)"));
+ assertThat(expected).hasMessageThat().contains(
+ "'non_empty' is no longer supported. use allow_empty instead.");
+ attr = buildAttribute("a2", "attr.string_list(allow_empty=False)");
+ assertThat(attr.isNonEmpty()).isTrue();
+ }
+
+ @Test
public void testAttrAllowedSingleFileTypesWrongType() throws Exception {
checkErrorContains(
"allow_single_file should be a boolean or a string list",