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