Skylark: allow_files can now accept a string list argument -- MOS_MIGRATED_REVID=122052644
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java index 85ab569..95f4bd4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
@@ -40,6 +40,7 @@ import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.syntax.Type.ConversionException; import com.google.devtools.build.lib.syntax.UserDefinedFunction; +import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.FileTypeSet; import java.util.ArrayList; @@ -65,7 +66,8 @@ private static final String ALLOW_FILES_ARG = "allow_files"; private static final String ALLOW_FILES_DOC = - "whether File targets are allowed. Can be True, False (default), or a FileType filter."; + "whether File targets are allowed. Can be True, False (default), or a list of file " + + "extensions that are allowed (e.g. <code>[\".cc\", \".cpp\"]</code>)."; private static final String ALLOW_RULES_ARG = "allow_rules"; private static final String ALLOW_RULES_DOC = @@ -164,10 +166,16 @@ } else if (fileTypesObj == Boolean.FALSE) { builder.allowedFileTypes(FileTypeSet.NO_FILE); } else if (fileTypesObj instanceof SkylarkFileType) { + // TODO(laurentlb): deprecated, to be removed builder.allowedFileTypes(((SkylarkFileType) fileTypesObj).getFileTypeSet()); + } else if (fileTypesObj instanceof SkylarkList) { + List<String> arg = + SkylarkList.castSkylarkListOrNoneToList( + fileTypesObj, String.class, "allow_files argument"); + builder.allowedFileTypes(FileType.of(arg)); } else { throw new EvalException( - ast.getLocation(), "allow_files should be a boolean or a filetype object."); + ast.getLocation(), "allow_files should be a boolean or a string list"); } } else if (type.equals(BuildType.LABEL) || type.equals(BuildType.LABEL_LIST)) { builder.allowedFileTypes(FileTypeSet.NO_FILE);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkFileType.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkFileType.java index 806b836..94ca4c8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkFileType.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkFileType.java
@@ -27,8 +27,8 @@ * A wrapper class for FileType and FileTypeSet functionality in Skylark. */ @SkylarkModule(name = "FileType", - doc = "File type for file filtering. Can be used to filter collections of labels for certain " - + "file types.") + doc = "Deprecated. File type for file filtering. Can be used to filter collections of labels " + + "for certain file types.") public class SkylarkFileType { private final FileType fileType;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java index 706a86a..f205be8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
@@ -691,8 +691,9 @@ }; @SkylarkSignature(name = "FileType", - doc = "Creates a file filter from a list of strings. For example, to match files ending " - + "with .cc or .cpp, use: <pre class=language-python>FileType([\".cc\", \".cpp\"])</pre>", + doc = "Deprecated. Creates a file filter from a list of strings. For example, to match " + + "files ending with .cc or .cpp, use: " + + "<pre class=language-python>FileType([\".cc\", \".cpp\"])</pre>", returnType = SkylarkFileType.class, mandatoryPositionals = { @Param(name = "types", type = SkylarkList.class, generic1 = String.class, defaultValue = "[]",
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 50bd25a..7d8a64a 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
@@ -161,8 +161,16 @@ @Test public void testAttrAllowedFileTypesWrongType() throws Exception { checkErrorContains( - "allow_files should be a boolean or a filetype object.", - "attr.label_list(allow_files = ['.xml'])"); + "allow_files should be a boolean or a string list", + "attr.label_list(allow_files = 18)"); + } + + @Test + public void testAttrWithList() throws Exception { + Attribute attr = evalAttributeDefinition("attr.label_list(allow_files = ['.xml'])") + .build("a1"); + assertTrue(attr.getAllowedFileTypesPredicate().apply("a.xml")); + assertFalse(attr.getAllowedFileTypesPredicate().apply("a.txt")); } @Test