aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar shahan <shahan@google.com>2018-02-07 13:49:06 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-07 13:51:02 -0800
commit342f9fdd1444d90dec61c60c08ed2aa62a862860 (patch)
treeb93efac02d203cf9e572dcdf222a765a8b099299 /src
parent2fff952bbccc4c8436223314e3636fdd05e2073d (diff)
@AutoCodec adds Singleton strategy.
PiperOrigin-RevId: 184889583
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java21
2 files changed, 31 insertions, 0 deletions
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.
+ *
+ * <p>Commonly used with the POLYMORPHIC strategy.
+ *
+ * <p>The serialized class must have a codec accessible, static INSTANCE field.
+ *
+ * <p>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()