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