From 342f9fdd1444d90dec61c60c08ed2aa62a862860 Mon Sep 17 00:00:00 2001 From: shahan Date: Wed, 7 Feb 2018 13:49:06 -0800 Subject: @AutoCodec adds Singleton strategy. PiperOrigin-RevId: 184889583 --- .../skyframe/serialization/autocodec/AutoCodec.java | 10 ++++++++++ .../serialization/autocodec/AutoCodecProcessor.java | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+) (limited to 'src/main/java/com') diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java index a4f9fa7adb..be6a2bb47b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java @@ -67,6 +67,16 @@ public @interface AutoCodec { * uses its codec to serialize the data. */ POLYMORPHIC, + /** + * For use with classes that are singleton. + * + *

Commonly used with the POLYMORPHIC strategy. + * + *

The serialized class must have a codec accessible, static INSTANCE field. + * + *

Illegal to use with a non-Void dependency. + */ + SINGLETON } /** diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java index f0fe3c0e1a..4d34175926 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java @@ -110,6 +110,9 @@ public class AutoCodecProcessor extends AbstractProcessor { case POLYMORPHIC: codecClassBuilder = buildClassWithPolymorphicStrategy(encodedType, dependencyType); break; + case SINGLETON: + codecClassBuilder = buildClassWithSingletonStrategy(encodedType, dependencyType); + break; default: throw new IllegalArgumentException("Unknown strategy: " + annotation.strategy()); } @@ -607,6 +610,24 @@ public class AutoCodecProcessor extends AbstractProcessor { return builder.build(); } + private static TypeSpec.Builder buildClassWithSingletonStrategy( + TypeElement encodedType, @Nullable TypeElement dependency) { + if (dependency != null) { + throw new IllegalArgumentException( + encodedType + " specifies a dependency, but SINGLETON is selected as the strategy."); + } + TypeSpec.Builder codecClassBuilder = + AutoCodecUtil.initializeCodecClassBuilder(encodedType, dependency); + // Serialization is a no-op. + codecClassBuilder.addMethod( + AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, dependency).build()); + MethodSpec.Builder deserializeMethodBuilder = + AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType, dependency); + deserializeMethodBuilder.addStatement("return $T.INSTANCE", TypeName.get(encodedType.asType())); + codecClassBuilder.addMethod(deserializeMethodBuilder.build()); + return codecClassBuilder; + } + /** True when {@code type} has the same type as {@code clazz}. */ private boolean matchesType(TypeMirror type, Class clazz) { return env.getTypeUtils() -- cgit v1.2.3