diff options
Diffstat (limited to 'src')
8 files changed, 58 insertions, 6 deletions
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 28ae658324..a612326495 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 @@ public class SkylarkRuleClassFunctions { 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 29d8d193fc..7de5cc9b00 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 @@ public final class SkylarkSemanticsCodec implements ObjectCodec<SkylarkSemantics 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 @@ public final class SkylarkSemanticsCodec implements ObjectCodec<SkylarkSemantics 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 2bbe8711d1..499f7d2596 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 class SkylarkSemanticsOptions extends OptionsBase implements Serializable 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 @@ public class SkylarkSemanticsOptions extends OptionsBase implements Serializable .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 52409387c4..25946d88e3 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 class SkylarkSemantics { public abstract boolean incompatibleDisallowDictPlus(); + public abstract boolean incompatibleDisallowFileType(); + public abstract boolean incompatibleDisallowOldStyleArgsAdd(); public abstract boolean incompatibleDisallowSlashOperator(); @@ -88,6 +90,7 @@ public abstract class SkylarkSemantics { .incompatibleDisableGlobTracking(true) .incompatibleDisableObjcProviderResources(false) .incompatibleDisallowDictPlus(false) + .incompatibleDisallowFileType(false) .incompatibleDisallowOldStyleArgsAdd(false) .incompatibleDisallowSlashOperator(false) .incompatibleNewActionsApi(false) @@ -115,6 +118,8 @@ public abstract class SkylarkSemantics { 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 4c1eb448ec..234526b57c 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.SkylarkDict; 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 @@ public class SkylarkDocumentationTest extends SkylarkTestCase { } @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 057a7b7319..569f3c36e8 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 @@ public class SkylarkSemanticsConsistencyTest { "--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 @@ public class SkylarkSemanticsConsistencyTest { .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 b13d64ac8b..307139fe78 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.skylark.util.SkylarkTestCase; 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 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase { } @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 38d32e5e29..f292a3da16 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.rules.platform.PlatformCommon; 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 @@ public abstract class SkylarkTestCase extends BuildViewTestCase { @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 @@ public abstract class SkylarkTestCase extends BuildViewTestCase { .build(); Environment env = Environment.builder(mutability) - .useDefaultSemantics() + .setSemantics(semantics) .setEventHandler(getEventHandler()) .setGlobals( SkylarkModules.getGlobals(modules) @@ -142,6 +143,12 @@ public abstract class SkylarkTestCase extends BuildViewTestCase { 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 { |