diff options
author | 2018-02-13 16:25:36 -0800 | |
---|---|---|
committer | 2018-02-13 16:27:05 -0800 | |
commit | cd72f4b1769d169115347a61a67c5ed7087354fb (patch) | |
tree | baa5bd72c41b9aa3863ab33500bbe3b7ba3fe4b4 /src/main/java/com/google/devtools | |
parent | f3300b3096a58599d63e64e025666c92e1aef1b1 (diff) |
Add Codec for NativeAspectClass. As a result, remove @AutoCodec from concrete subclasses. Improve debugging message on serialization failures.
Lot of test-side changes to make sure aspects are properly registered with the RuleClassProvider.
PiperOrigin-RevId: 185607202
Diffstat (limited to 'src/main/java/com/google/devtools')
6 files changed, 37 insertions, 23 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java b/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java index 905862a8d7..ed6b77bbc2 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/NativeAspectClass.java @@ -14,6 +14,16 @@ package com.google.devtools.build.lib.packages; +import com.google.common.base.Preconditions; +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.devtools.build.lib.skyframe.serialization.strings.StringCodecs; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; + /** * A class of aspects that are implemented natively in Bazel. * @@ -21,6 +31,7 @@ package com.google.devtools.build.lib.packages; * aspect factory. All wrappers of the same class are equal. */ public abstract class NativeAspectClass implements AspectClass { + public static final ObjectCodec<NativeAspectClass> CODEC = new Codec(); @Override public String getName() { @@ -29,4 +40,30 @@ public abstract class NativeAspectClass implements AspectClass { public abstract AspectDefinition getDefinition(AspectParameters aspectParameters); + private static class Codec implements ObjectCodec<NativeAspectClass> { + @Override + public Class<NativeAspectClass> getEncodedClass() { + return NativeAspectClass.class; + } + + @Override + public void serialize( + SerializationContext context, NativeAspectClass obj, CodedOutputStream codedOut) + throws SerializationException, IOException { + RuleClassProvider ruleClassProvider = context.getDependency(RuleClassProvider.class); + NativeAspectClass storedAspect = ruleClassProvider.getNativeAspectClass(obj.getKey()); + Preconditions.checkState( + obj == storedAspect, "Not stored right: %s %s %s", obj, storedAspect, ruleClassProvider); + StringCodecs.asciiOptimized().serialize(context, obj.getKey(), codedOut); + } + + @Override + public NativeAspectClass deserialize(DeserializationContext context, CodedInputStream codedIn) + throws SerializationException, IOException { + String aspectKey = StringCodecs.asciiOptimized().deserialize(context, codedIn); + return Preconditions.checkNotNull( + context.getDependency(RuleClassProvider.class).getNativeAspectClass(aspectKey), + aspectKey); + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeAspect.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeAspect.java index 00b82486fb..4048b2fc22 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeAspect.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeAspect.java @@ -16,15 +16,10 @@ package com.google.devtools.build.lib.packages; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.events.Location; -import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; /** A natively-defined aspect that is may be referenced by skylark attribute definitions. */ -@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC) public abstract class SkylarkNativeAspect extends NativeAspectClass implements SkylarkAspect { - public static final ObjectCodec<SkylarkNativeAspect> CODEC = new SkylarkNativeAspect_AutoCodec(); - @Override public void repr(SkylarkPrinter printer) { printer.append("<native aspect>"); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java index 42858be571..ff56c613fe 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java @@ -28,8 +28,6 @@ import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaInfo; import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndTarget; -import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import java.util.ArrayList; import java.util.List; @@ -41,11 +39,7 @@ import java.util.List; * <p>One would think that using the compile time classpath would be enough, but alas, those are * ijars, */ -@AutoCodec public class AndroidNeverlinkAspect extends NativeAspectClass implements ConfiguredAspectFactory { - public static final ObjectCodec<AndroidNeverlinkAspect> CODEC = - new AndroidNeverlinkAspect_AutoCodec(); - public static final String NAME = "AndroidNeverlinkAspect"; private static final ImmutableList<String> ATTRIBUTES = ImmutableList.of( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java index 92eaa877f5..e8be797e4f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java @@ -65,7 +65,6 @@ import com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryAspectProv import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider; import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndTarget; -import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import java.util.HashMap; import java.util.HashSet; @@ -78,8 +77,6 @@ import java.util.Set; public final class DexArchiveAspect extends NativeAspectClass implements ConfiguredAspectFactory { public static final String NAME = "DexArchiveAspect"; - public static final ObjectCodec<DexArchiveAspect> CODEC = new DexArchiveAspect_AutoCodec(); - /** * Function that returns a {@link Rule}'s {@code incremental_dexing} attribute for use by this * aspect. Must be provided when attaching this aspect to a target. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java index 5de8b4656a..984d145bc9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java @@ -73,17 +73,13 @@ import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; import com.google.devtools.build.lib.rules.proto.ProtoSupportDataProvider; import com.google.devtools.build.lib.rules.proto.SupportData; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndTarget; -import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.List; /** J2ObjC transpilation aspect for Java and proto rules. */ -@AutoCodec public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectFactory { public static final String NAME = "J2ObjcAspect"; - public static final ObjectCodec<J2ObjcAspect> CODEC = new J2ObjcAspect_AutoCodec(); private final String toolsRepository; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java index 9bd8e02294..010f2bcca3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java @@ -30,19 +30,14 @@ import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.SkylarkNativeAspect; import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndTarget; -import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; /** * Aspect that gathers the proto dependencies of the attached rule target, and propagates the proto * values of its dependencies through the ObjcProtoProvider. */ -@AutoCodec public class ObjcProtoAspect extends SkylarkNativeAspect implements ConfiguredAspectFactory { public static final String NAME = "ObjcProtoAspect"; - public static final ObjectCodec<ObjcProtoAspect> CODEC = new ObjcProtoAspect_AutoCodec(); - @Override public AspectDefinition getDefinition(AspectParameters aspectParameters) { return new AspectDefinition.Builder(this) |