Introduce `--incompatible_disallow_filetype` to remove the `FileType` function. RELNOTES: `FileType` is deprecated and will be removed soon. Try the `--incompatible_disallow_filetype` flag to ensure your code is forward-compatible. PiperOrigin-RevId: 192758063
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java index 28ae658..a612326 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -1087,11 +1087,21 @@ defaultValue = "[]", doc = "a list of the accepted file extensions." ) - } + }, + useLocation = true, + useEnvironment = true ) private static final BuiltinFunction fileType = new BuiltinFunction("FileType") { - public SkylarkFileType invoke(SkylarkList types) throws EvalException { + public SkylarkFileType invoke(SkylarkList types, Location loc, Environment env) + throws EvalException { + if (env.getSemantics().incompatibleDisallowFileType()) { + throw new EvalException( + loc, + "FileType function is not available. You may use a list of strings instead. " + + "You can temporarily reenable the function by passing the flag " + + "--incompatible_disallow_filetype=false"); + } return SkylarkFileType.of(types.getContents(String.class, "types")); } };
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 29d8d19..7de5cc9 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
@@ -49,6 +49,7 @@ codedOut.writeBoolNoTag(semantics.incompatibleDisableGlobTracking()); codedOut.writeBoolNoTag(semantics.incompatibleDisableObjcProviderResources()); codedOut.writeBoolNoTag(semantics.incompatibleDisallowDictPlus()); + codedOut.writeBoolNoTag(semantics.incompatibleDisallowFileType()); codedOut.writeBoolNoTag(semantics.incompatibleDisallowOldStyleArgsAdd()); codedOut.writeBoolNoTag(semantics.incompatibleDisallowSlashOperator()); codedOut.writeBoolNoTag(semantics.incompatibleNewActionsApi()); @@ -71,6 +72,7 @@ builder.incompatibleDisableGlobTracking(codedIn.readBool()); builder.incompatibleDisableObjcProviderResources(codedIn.readBool()); builder.incompatibleDisallowDictPlus(codedIn.readBool()); + builder.incompatibleDisallowFileType(codedIn.readBool()); builder.incompatibleDisallowOldStyleArgsAdd(codedIn.readBool()); builder.incompatibleDisallowSlashOperator(codedIn.readBool()); builder.incompatibleNewActionsApi(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 2bbe871..499f7d2 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
@@ -145,6 +145,19 @@ public boolean incompatibleDisallowDictPlus; @Option( + name = "incompatible_disallow_filetype", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, + effectTags = {OptionEffectTag.UNKNOWN}, + metadataTags = { + OptionMetadataTag.INCOMPATIBLE_CHANGE, + OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES + }, + help = "If set to true, function `FileType` is not available." + ) + public boolean incompatibleDisallowFileType; + + @Option( name = "incompatible_disallow_slash_operator", defaultValue = "false", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, @@ -266,6 +279,7 @@ .incompatibleDisableGlobTracking(incompatibleDisableGlobTracking) .incompatibleDisableObjcProviderResources(incompatibleDisableObjcProviderResources) .incompatibleDisallowDictPlus(incompatibleDisallowDictPlus) + .incompatibleDisallowFileType(incompatibleDisallowFileType) .incompatibleDisallowOldStyleArgsAdd(incompatibleDisallowOldStyleArgsAdd) .incompatibleDisallowSlashOperator(incompatibleDisallowSlashOperator) .incompatibleNewActionsApi(incompatibleNewActionsApi)
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 5240938..25946d8 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
@@ -51,6 +51,8 @@ public abstract boolean incompatibleDisallowDictPlus(); + public abstract boolean incompatibleDisallowFileType(); + public abstract boolean incompatibleDisallowOldStyleArgsAdd(); public abstract boolean incompatibleDisallowSlashOperator(); @@ -88,6 +90,7 @@ .incompatibleDisableGlobTracking(true) .incompatibleDisableObjcProviderResources(false) .incompatibleDisallowDictPlus(false) + .incompatibleDisallowFileType(false) .incompatibleDisallowOldStyleArgsAdd(false) .incompatibleDisallowSlashOperator(false) .incompatibleNewActionsApi(false) @@ -115,6 +118,8 @@ public abstract Builder incompatibleDisallowDictPlus(boolean value); + public abstract Builder incompatibleDisallowFileType(boolean value); + public abstract Builder incompatibleDisallowOldStyleArgsAdd(boolean value); public abstract Builder incompatibleDisallowSlashOperator(boolean value);
diff --git a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java index 4c1eb44..234526b 100644 --- a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java +++ b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java
@@ -34,6 +34,7 @@ import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.syntax.SkylarkList.MutableList; import com.google.devtools.build.lib.syntax.SkylarkList.Tuple; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.syntax.util.EvaluationTestCase; import java.lang.reflect.Method; import java.util.ArrayList; @@ -66,7 +67,7 @@ } @Override - protected EvaluationTestCase createEvaluationTestCase() { + protected EvaluationTestCase createEvaluationTestCase(SkylarkSemantics semantics) { return new EvaluationTestCase(); }
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 057a7b7..569f3c3 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
@@ -125,6 +125,7 @@ "--incompatible_disable_glob_tracking=" + rand.nextBoolean(), "--incompatible_disable_objc_provider_resources=" + rand.nextBoolean(), "--incompatible_disallow_dict_plus=" + rand.nextBoolean(), + "--incompatible_disallow_filetype=" + rand.nextBoolean(), "--incompatible_disallow_old_style_args_add=" + rand.nextBoolean(), "--incompatible_disallow_slash_operator=" + rand.nextBoolean(), "--incompatible_new_actions_api=" + rand.nextBoolean(), @@ -148,6 +149,7 @@ .incompatibleDisableGlobTracking(rand.nextBoolean()) .incompatibleDisableObjcProviderResources(rand.nextBoolean()) .incompatibleDisallowDictPlus(rand.nextBoolean()) + .incompatibleDisallowFileType(rand.nextBoolean()) .incompatibleDisallowOldStyleArgsAdd(rand.nextBoolean()) .incompatibleDisallowSlashOperator(rand.nextBoolean()) .incompatibleNewActionsApi(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 b13d64a..307139f 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
@@ -51,11 +51,13 @@ import com.google.devtools.build.lib.syntax.BuildFileAST; import com.google.devtools.build.lib.syntax.ClassObject; import com.google.devtools.build.lib.syntax.Environment; +import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.EvalUtils; import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkList.MutableList; import com.google.devtools.build.lib.syntax.SkylarkList.Tuple; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.testutil.MoreAsserts; import com.google.devtools.build.lib.util.FileTypeSet; @@ -793,6 +795,15 @@ } @Test + public void testFileTypeIsDisabled() throws Exception { + SkylarkSemantics semantics = + SkylarkSemantics.DEFAULT_SEMANTICS.toBuilder().incompatibleDisallowFileType(true).build(); + EvalException expected = + assertThrows(EvalException.class, () -> evalRuleClassCode(semantics, "FileType(['.css'])")); + assertThat(expected).hasMessageThat().contains("FileType function is not available."); + } + + @Test public void testRuleInheritsBaseRuleAttributes() throws Exception { evalAndExport("def impl(ctx): return None", "r1 = rule(impl)"); RuleClass c = ((SkylarkRuleFunction) lookup("r1")).getRuleClass();
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java index 38d32e5..f292a3d 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.syntax.Environment; import com.google.devtools.build.lib.syntax.Environment.Phase; import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import com.google.devtools.build.lib.syntax.SkylarkUtils; import com.google.devtools.build.lib.syntax.util.EvaluationTestCase; import com.google.devtools.build.lib.testutil.TestConstants; @@ -47,11 +48,11 @@ @Before public final void setUpEvaluator() throws Exception { - ev = createEvaluationTestCase(); + ev = createEvaluationTestCase(SkylarkSemantics.DEFAULT_SEMANTICS); ev.initialize(); } - protected EvaluationTestCase createEvaluationTestCase() { + protected EvaluationTestCase createEvaluationTestCase(SkylarkSemantics semantics) { return new EvaluationTestCase() { @Override public Environment newEnvironment() throws Exception { @@ -62,7 +63,7 @@ .build(); Environment env = Environment.builder(mutability) - .useDefaultSemantics() + .setSemantics(semantics) .setEventHandler(getEventHandler()) .setGlobals( SkylarkModules.getGlobals(modules) @@ -142,6 +143,12 @@ return eval("def impl(ctx): return None\n" + Joiner.on("\n").join(lines)); } + protected Object evalRuleClassCode(SkylarkSemantics semantics, String... lines) throws Exception { + ev = createEvaluationTestCase(semantics); + ev.initialize(); + return eval("def impl(ctx): return None\n" + Joiner.on("\n").join(lines)); + } + protected void checkError(SkylarkRuleContext ruleContext, String errorMsg, String... lines) throws Exception { try {