aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
diff options
context:
space:
mode:
authorGravatar janakr <janakr@google.com>2018-03-26 10:55:59 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-26 10:57:37 -0700
commitee5bf489c45bd41e63acecad349f13b594729f51 (patch)
tree3af36bbdd513317c6805d0eb3458b29c40cb6277 /src/main/java/com/google/devtools/build/lib/packages/Aspect.java
parent51cb8ffd43a93c29c93251155d7f5be87ddab1ec (diff)
Add AspectCodec. Can't be @AutoCodec because we don't want to serialize the full content of native aspects.
PiperOrigin-RevId: 190489694
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages/Aspect.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Aspect.java43
1 files changed, 43 insertions, 0 deletions
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 14e9d5dbf0..b0ccfe6c4e 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 @@ package com.google.devtools.build.lib.packages;
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 @@ public final class Aspect implements DependencyFilter.AttributeInfoProvider {
// 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());
+ }
+ }
+ }
}