@AutoCodec TransitiveTraversalValue, DirectoryListingStateValue.

PiperOrigin-RevId: 188077900
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateValue.java
index 39343a2..c0503cb 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateValue.java
@@ -40,6 +40,7 @@
  *
  * <p>This class is an implementation detail of {@link DirectoryListingValue}.
  */
+@AutoCodec.VisibleForSerialization
 public final class DirectoryListingStateValue implements SkyValue {
 
   private final CompactSortedDirents compactSortedDirents;
@@ -48,6 +49,7 @@
     this.compactSortedDirents = CompactSortedDirents.create(dirents);
   }
 
+  @AutoCodec.Instantiator
   public static DirectoryListingStateValue create(Collection<Dirent> dirents) {
     return new DirectoryListingStateValue(dirents);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
index 866bbb4..655cadd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.packages.AdvertisedProviderSet;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.util.StringCanonicalizer;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
@@ -38,6 +39,7 @@
  */
 @Immutable
 @ThreadSafe
+@AutoCodec
 public abstract class TransitiveTraversalValue implements SkyValue {
   // A quick-lookup cache that allows us to get the value for a given target kind, assuming no error
   // messages for the target. The number of built-in target kinds is limited, so memory bloat is not
@@ -97,6 +99,7 @@
     }
   }
 
+  @AutoCodec.Instantiator
   public static TransitiveTraversalValue create(
       AdvertisedProviderSet providers, String kind, @Nullable String firstErrorMessage) {
     TransitiveTraversalValue value =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableSetRuntimeCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableSetRuntimeCodec.java
new file mode 100644
index 0000000..5a6a487
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableSetRuntimeCodec.java
@@ -0,0 +1,53 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skyframe.serialization;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import java.io.IOException;
+
+/** {@link ObjectCodec} for {@link ImmutableSet}. */
+@SuppressWarnings("rawtypes") // Intentional erasure of ImmutableSet.
+class ImmutableSetRuntimeCodec implements ObjectCodec<ImmutableSet> {
+  @Override
+  public Class<ImmutableSet> getEncodedClass() {
+    return ImmutableSet.class;
+  }
+
+  @Override
+  public void serialize(
+      SerializationContext context, ImmutableSet object, CodedOutputStream codedOut)
+      throws SerializationException, IOException {
+    codedOut.writeInt32NoTag(object.size());
+    for (Object obj : object) {
+      context.serialize(obj, codedOut);
+    }
+  }
+
+  @SuppressWarnings("unchecked") // Adding object to untyped builder.
+  @Override
+  public ImmutableSet deserialize(DeserializationContext context, CodedInputStream codedIn)
+      throws SerializationException, IOException {
+    int size = codedIn.readInt32();
+    ImmutableSet.Builder builder = ImmutableSet.builderWithExpectedSize(size);
+    for (int i = 0; i < size; i++) {
+      // Don't inline so builder knows this is an object, not an array.
+      Object item = context.deserialize(codedIn);
+      builder.add(item);
+    }
+    return builder.build();
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Dirent.java b/src/main/java/com/google/devtools/build/lib/vfs/Dirent.java
index f93a0b1..27a69ef 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Dirent.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Dirent.java
@@ -14,10 +14,12 @@
 package com.google.devtools.build.lib.vfs;
 
 import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import java.io.Serializable;
 import java.util.Objects;
 
 /** Directory entry representation returned by {@link Path#readdir}. */
+@AutoCodec
 public final class Dirent implements Serializable, Comparable<Dirent> {
   /** Type of the directory entry */
   public enum Type {