Add @AutoCodec to FileType and FileTypeSet.
More strictly type the arguments for creating FileTypes.

PiperOrigin-RevId: 187391336
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 433aacf..c41711d 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -209,6 +209,7 @@
     ],
     deps = [
         ":string_util",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkFileType.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkFileType.java
index 931131c..9fda709 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkFileType.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkFileType.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.syntax.EvalUtils;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.FileTypeSet;
+import java.util.List;
 
 /** A wrapper class for FileType and FileTypeSet functionality in Skylark. */
 @SkylarkModule(
@@ -40,7 +41,7 @@
     this.fileType = fileType;
   }
 
-  public static SkylarkFileType of(Iterable<String> extensions) {
+  public static SkylarkFileType of(List<String> extensions) {
     return new SkylarkFileType(FileType.of(extensions));
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/util/FileType.java b/src/main/java/com/google/devtools/build/lib/util/FileType.java
index e2f9eb3..6cfead9 100644
--- a/src/main/java/com/google/devtools/build/lib/util/FileType.java
+++ b/src/main/java/com/google/devtools/build/lib/util/FileType.java
@@ -19,15 +19,15 @@
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import javax.annotation.concurrent.Immutable;
 
-/**
- * A base class for FileType matchers.
- */
+/** A base class for FileType matchers. */
 @Immutable
+@AutoCodec
 public abstract class FileType implements Predicate<String> {
   // A special file type
   public static final FileType NO_EXTENSION =
@@ -53,7 +53,8 @@
     };
   }
 
-  public static FileType of(final Iterable<String> extensions) {
+  @AutoCodec.Instantiator
+  public static FileType of(final List<String> extensions) {
     return new FileType() {
       @Override
       public boolean apply(String path) {
diff --git a/src/main/java/com/google/devtools/build/lib/util/FileTypeSet.java b/src/main/java/com/google/devtools/build/lib/util/FileTypeSet.java
index 9b3b2e4..de0fb2c 100644
--- a/src/main/java/com/google/devtools/build/lib/util/FileTypeSet.java
+++ b/src/main/java/com/google/devtools/build/lib/util/FileTypeSet.java
@@ -17,19 +17,21 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import javax.annotation.concurrent.Immutable;
 
-/**
- * A set of FileTypes for grouped matching.
- */
+/** A set of FileTypes for grouped matching. */
 @Immutable
+@AutoCodec
 public class FileTypeSet implements Predicate<String> {
-  private final ImmutableSet<FileType> types;
+  private final ImmutableSet<FileType> fileTypes;
 
   /** A set that matches all files. */
+  @AutoCodec
   public static final FileTypeSet ANY_FILE =
       new FileTypeSet() {
         @Override
@@ -49,6 +51,7 @@
       };
 
   /** A predicate that matches no files. */
+  @AutoCodec
   public static final FileTypeSet NO_FILE =
       new FileTypeSet(ImmutableList.of()) {
         @Override
@@ -63,15 +66,17 @@
       };
 
   private FileTypeSet() {
-    this.types = null;
+    this.fileTypes = null;
   }
 
   private FileTypeSet(FileType... fileTypes) {
-    this.types = ImmutableSet.copyOf(fileTypes);
+    this.fileTypes = ImmutableSet.copyOf(fileTypes);
   }
 
-  private FileTypeSet(Iterable<FileType> fileTypes) {
-    this.types = ImmutableSet.copyOf(fileTypes);
+  @AutoCodec.Instantiator
+  @VisibleForSerialization
+  FileTypeSet(Iterable<FileType> fileTypes) {
+    this.fileTypes = ImmutableSet.copyOf(fileTypes);
   }
 
   /**
@@ -102,12 +107,12 @@
 
   /** Returns a copy of this {@link FileTypeSet} including the specified `fileTypes`. */
   public FileTypeSet including(FileType... fileTypes) {
-    return new FileTypeSet(Iterables.concat(this.types, Arrays.asList(fileTypes)));
+    return new FileTypeSet(Iterables.concat(this.fileTypes, Arrays.asList(fileTypes)));
   }
 
   /** Returns true if the filename can be matched by any FileType in this set. */
   public boolean matches(String path) {
-    for (FileType type : types) {
+    for (FileType type : fileTypes) {
       if (type.apply(path)) {
         return true;
       }
@@ -115,6 +120,11 @@
     return false;
   }
 
+  @VisibleForSerialization
+  ImmutableSet<FileType> getFileTypes() {
+    return fileTypes;
+  }
+
   /** Returns true if this predicate matches nothing. */
   public boolean isNone() {
     return this == FileTypeSet.NO_FILE;
@@ -128,7 +138,7 @@
   /** Returns the list of possible file extensions for this file type. Can be empty. */
   public List<String> getExtensions() {
     List<String> extensions = new ArrayList<>();
-    for (FileType type : types) {
+    for (FileType type : fileTypes) {
       extensions.addAll(type.getExtensions());
     }
     return extensions;