aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/util
diff options
context:
space:
mode:
authorGravatar janakr <janakr@google.com>2018-03-26 09:44:39 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-26 09:46:21 -0700
commitd63c16f7bcbaede6fed0142a923cce076ca1df7f (patch)
tree1d39b5bbae949c354b884f14e545531bd7283936 /src/main/java/com/google/devtools/build/lib/util
parentcf1c75a67dc7aadcca24c869a9dd19dc93df5d19 (diff)
Redo FileType @AutoCodec: it is risky to assume that all subclasses are totally described by their extensions, since many are not. Instead, explicitly @AutoCodec those that are, and leave the rest to be individually handled. This also allows us to do equality checking.
There is a slight memory penalty here, but there are ~100s of FileTypes in a large build, so it should be negligible. PiperOrigin-RevId: 190477427
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/util')
-rw-r--r--src/main/java/com/google/devtools/build/lib/util/FileType.java64
1 files changed, 38 insertions, 26 deletions
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 6cfead9578..599851dbbb 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
@@ -20,6 +20,7 @@ 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 com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -27,9 +28,9 @@ import javax.annotation.concurrent.Immutable;
/** A base class for FileType matchers. */
@Immutable
-@AutoCodec
public abstract class FileType implements Predicate<String> {
// A special file type
+ @AutoCodec @VisibleForSerialization
public static final FileType NO_EXTENSION =
new FileType() {
@Override
@@ -40,37 +41,48 @@ public abstract class FileType implements Predicate<String> {
};
public static FileType of(final String ext) {
- return new FileType() {
- @Override
- public boolean apply(String path) {
- return path.endsWith(ext);
- }
-
- @Override
- public List<String> getExtensions() {
- return ImmutableList.of(ext);
- }
- };
+ return new ListFileType(ImmutableList.of(ext));
}
- @AutoCodec.Instantiator
public static FileType of(final List<String> extensions) {
- return new FileType() {
- @Override
- public boolean apply(String path) {
- for (String ext : extensions) {
- if (path.endsWith(ext)) {
- return true;
- }
+ return new ListFileType(ImmutableList.copyOf(extensions));
+ }
+
+ @AutoCodec.VisibleForSerialization
+ @AutoCodec
+ static final class ListFileType extends FileType {
+ private final ImmutableList<String> extensions;
+
+ @AutoCodec.VisibleForSerialization
+ ListFileType(ImmutableList<String> extensions) {
+ this.extensions = Preconditions.checkNotNull(extensions);
+ }
+
+ @Override
+ public boolean apply(String path) {
+ for (String ext : extensions) {
+ if (path.endsWith(ext)) {
+ return true;
}
- return false;
}
+ return false;
+ }
- @Override
- public List<String> getExtensions() {
- return ImmutableList.copyOf(extensions);
- }
- };
+ @Override
+ public List<String> getExtensions() {
+ return ImmutableList.copyOf(extensions);
+ }
+
+ @Override
+ public int hashCode() {
+ return extensions.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return (obj instanceof ListFileType
+ && this.extensions.equals(((ListFileType) obj).extensions));
+ }
}
public static FileType of(final String... extensions) {