Add AspectCodec. Can't be @AutoCodec because we don't want to serialize the full content of native aspects.

PiperOrigin-RevId: 190489694
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
index 14e9d5d..b0ccfe6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
@@ -15,6 +15,13 @@
 
 import com.google.common.base.Preconditions;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import java.io.IOException;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -105,4 +112,40 @@
     // All aspect attributes are implicit.
     return false;
   }
+
+  /** {@link ObjectCodec} for {@link Aspect}. */
+  static class AspectCodec implements ObjectCodec<Aspect> {
+    @Override
+    public Class<Aspect> getEncodedClass() {
+      return Aspect.class;
+    }
+
+    @Override
+    public void serialize(SerializationContext context, Aspect obj, CodedOutputStream codedOut)
+        throws SerializationException, IOException {
+      context.serialize(obj.getDescriptor(), codedOut);
+      boolean nativeAspect = obj.getDescriptor().getAspectClass() instanceof NativeAspectClass;
+      codedOut.writeBoolNoTag(nativeAspect);
+      if (!nativeAspect) {
+        context.serialize(obj.getDefinition(), codedOut);
+      }
+    }
+
+    @Override
+    public Aspect deserialize(DeserializationContext context, CodedInputStream codedIn)
+        throws SerializationException, IOException {
+      AspectDescriptor aspectDescriptor = context.deserialize(codedIn);
+      if (codedIn.readBool()) {
+        return forNative(
+            (NativeAspectClass) aspectDescriptor.getAspectClass(),
+            aspectDescriptor.getParameters());
+      } else {
+        AspectDefinition aspectDefinition = context.deserialize(codedIn);
+        return forSkylark(
+            (SkylarkAspectClass) aspectDescriptor.getAspectClass(),
+            aspectDefinition,
+            aspectDescriptor.getParameters());
+      }
+    }
+  }
 }