From 5e573b6d7227d0e0146f5ac63956848a1c366c21 Mon Sep 17 00:00:00 2001 From: shahan Date: Tue, 6 Feb 2018 12:19:34 -0800 Subject: @AutoCodec support for superclasses having generic parameters. PiperOrigin-RevId: 184720361 --- .../lib/skyframe/serialization/autocodec/AutoCodecProcessor.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/main/java/com/google/devtools') 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 9da4420e9f..f0fe3c0e1a 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 @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.PolymorphicHelper; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationCodeGenerator.Marshaller; +import com.squareup.javapoet.ClassName; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeName; @@ -506,7 +507,7 @@ public class AutoCodecProcessor extends AbstractProcessor { "this.$L_offset = $T.getInstance().objectFieldOffset($T.class.getDeclaredField(\"$L\"))", param.getSimpleName(), UnsafeProvider.class, - field.declaringClassType, + ClassName.get(field.declaringClassType), param.getSimpleName()); constructor.nextControlFlow("catch ($T e)", NoSuchFieldException.class); constructor.addStatement("throw new $T(e)", IllegalStateException.class); @@ -550,8 +551,11 @@ public class AutoCodecProcessor extends AbstractProcessor { return Optional.of(new FieldValueAndClass(field.get(), type)); } if (type.getSuperclass().getKind() != TypeKind.NONE) { + // Applies the erased superclass type so that it can be used in `T.class`. return getFieldByNameRecursive( - env.getElementUtils().getTypeElement(type.getSuperclass().toString()), name); + (TypeElement) + env.getTypeUtils().asElement(env.getTypeUtils().erasure(type.getSuperclass())), + name); } return Optional.empty(); } -- cgit v1.2.3