diff options
author | 2018-03-26 10:55:59 -0700 | |
---|---|---|
committer | 2018-03-26 10:57:37 -0700 | |
commit | ee5bf489c45bd41e63acecad349f13b594729f51 (patch) | |
tree | 3af36bbdd513317c6805d0eb3458b29c40cb6277 /src/main/java/com/google | |
parent | 51cb8ffd43a93c29c93251155d7f5be87ddab1ec (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')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/Aspect.java | 43 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java | 16 |
2 files changed, 53 insertions, 6 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()); + } + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java index 3036a68d9b..1b537e433b 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTr import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.syntax.Type.LabelClass; import com.google.devtools.build.lib.syntax.Type.LabelVisitor; @@ -38,11 +39,12 @@ import java.util.Map; import javax.annotation.Nullable; /** - * The definition of an aspect (see {@link Aspect} for moreinformation.) + * The definition of an aspect (see {@link Aspect} for more information). * * <p>Contains enough information to build up the configured target graph except for the actual way - * to build the Skyframe node (that is the territory of - * {@link com.google.devtools.build.lib.view AspectFactory}). In particular: + * to build the Skyframe node (that is the territory of {@link com.google.devtools.build.lib.view + * AspectFactory}). In particular: + * * <ul> * <li>The condition that must be fulfilled for an aspect to be able to operate on a configured * target @@ -54,6 +56,7 @@ import javax.annotation.Nullable; * <p>The way to build the Skyframe node is not here because this data needs to be accessible from * the {@code .packages} package and that one requires references to the {@code .view} package. */ +@AutoCodec @Immutable public final class AspectDefinition { private final AspectClass aspectClass; @@ -78,11 +81,12 @@ public final class AspectDefinition { return advertisedProviders; } - private AspectDefinition( + @AutoCodec.VisibleForSerialization + AspectDefinition( AspectClass aspectClass, AdvertisedProviderSet advertisedProviders, RequiredProviders requiredProviders, - RequiredProviders requiredAspectProviders, + RequiredProviders requiredProvidersForAspects, ImmutableMap<String, Attribute> attributes, ImmutableSet<Label> requiredToolchains, @Nullable ImmutableSet<String> restrictToAttributes, @@ -91,7 +95,7 @@ public final class AspectDefinition { this.aspectClass = aspectClass; this.advertisedProviders = advertisedProviders; this.requiredProviders = requiredProviders; - this.requiredProvidersForAspects = requiredAspectProviders; + this.requiredProvidersForAspects = requiredProvidersForAspects; this.attributes = attributes; this.requiredToolchains = requiredToolchains; |