From 5294d8231840e6737d3bf48f868abc4496675cd8 Mon Sep 17 00:00:00 2001 From: JFronny Date: Sun, 22 Jan 2023 14:59:43 +0100 Subject: [PATCH] @With annotation instead of legacy code for @JsonAdapter --- .../gson/compile/annotations/GWith.java | 9 +++++++ .../gson/compile/example/ExampleAdapter.java | 16 +++++++++++++ .../jfronny/gson/compile/example/Main.java | 1 + .../jfronny/gson/compile/processor/Cl.java | 4 ++-- .../adapter/impl/DeclaredAdapter.java | 24 ++----------------- 5 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 gson-compile-annotations/src/main/java/io/gitlab/jfronny/gson/compile/annotations/GWith.java create mode 100644 gson-compile-example/src/main/java/io/gitlab/jfronny/gson/compile/example/ExampleAdapter.java diff --git a/gson-compile-annotations/src/main/java/io/gitlab/jfronny/gson/compile/annotations/GWith.java b/gson-compile-annotations/src/main/java/io/gitlab/jfronny/gson/compile/annotations/GWith.java new file mode 100644 index 0000000..f86fa06 --- /dev/null +++ b/gson-compile-annotations/src/main/java/io/gitlab/jfronny/gson/compile/annotations/GWith.java @@ -0,0 +1,9 @@ +package io.gitlab.jfronny.gson.compile.annotations; + +import java.lang.annotation.*; + +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.SOURCE) +public @interface GWith { + Class serializer(); +} diff --git a/gson-compile-example/src/main/java/io/gitlab/jfronny/gson/compile/example/ExampleAdapter.java b/gson-compile-example/src/main/java/io/gitlab/jfronny/gson/compile/example/ExampleAdapter.java new file mode 100644 index 0000000..c9fd5b5 --- /dev/null +++ b/gson-compile-example/src/main/java/io/gitlab/jfronny/gson/compile/example/ExampleAdapter.java @@ -0,0 +1,16 @@ +package io.gitlab.jfronny.gson.compile.example; + +import io.gitlab.jfronny.gson.stream.JsonReader; +import io.gitlab.jfronny.gson.stream.JsonWriter; + +import java.io.IOException; + +public class ExampleAdapter { + public static void write(boolean bool, JsonWriter writer) throws IOException { + writer.value(!bool); + } + + public static boolean read(JsonReader reader) throws IOException { + return !reader.nextBoolean(); + } +} diff --git a/gson-compile-example/src/main/java/io/gitlab/jfronny/gson/compile/example/Main.java b/gson-compile-example/src/main/java/io/gitlab/jfronny/gson/compile/example/Main.java index da93cb2..06ff348 100644 --- a/gson-compile-example/src/main/java/io/gitlab/jfronny/gson/compile/example/Main.java +++ b/gson-compile-example/src/main/java/io/gitlab/jfronny/gson/compile/example/Main.java @@ -58,6 +58,7 @@ public class Main { @GSerializable(configure = Configuration.class) public static class ExamplePojo2 { @GComment("Yes!") + @GWith(serializer = ExampleAdapter.class) public boolean primitive; public ExamplePojo2[] recursiveTest; diff --git a/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/Cl.java b/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/Cl.java index 9914177..197c18f 100644 --- a/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/Cl.java +++ b/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/Cl.java @@ -10,15 +10,15 @@ public class Cl { public static final ClassName GSON_READER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonReader"); public static final ClassName GSON_TREE_READER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonTreeReader"); public static final ClassName GSON_TREE_WRITER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonTreeWriter"); - public static final ClassName JSON_ADAPTER = ClassName.get("io.gitlab.jfronny.gson.annotations", "JsonAdapter"); public static final ClassName TYPE_TOKEN = ClassName.get("io.gitlab.jfronny.gson.reflect", "TypeToken"); public static final ClassName GSON_TOKEN = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonToken"); public static final ClassName SERIALIZED_NAME = ClassName.get("io.gitlab.jfronny.gson.annotations", "SerializedName"); public static final ClassName GSON_SYNTAX_EXCEPTION = ClassName.get("io.gitlab.jfronny.gson", "JsonSyntaxException"); - public static final ClassName GCOMMENT = ClassName.get("io.gitlab.jfronny.gson.compile.annotations", "GComment"); public static final ClassName GISO8601UTILS = ClassName.get("io.gitlab.jfronny.gson.util", "ISO8601Utils"); public static final ClassName CCORE = ClassName.get("io.gitlab.jfronny.gson.compile.core", "CCore"); + public static final ClassName GCOMMENT = ClassName.get("io.gitlab.jfronny.gson.compile.annotations", "GComment"); + public static final ClassName GWITH = ClassName.get("io.gitlab.jfronny.gson.compile.annotations", "GWith"); public static final ClassName MANIFOLD_EXTENSION = ClassName.get("manifold.ext.rt.api", "Extension"); public static final ClassName MANIFOLD_THIS = ClassName.get("manifold.ext.rt.api", "This"); diff --git a/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/adapter/impl/DeclaredAdapter.java b/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/adapter/impl/DeclaredAdapter.java index d32cc69..c431af3 100644 --- a/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/adapter/impl/DeclaredAdapter.java +++ b/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/adapter/impl/DeclaredAdapter.java @@ -32,33 +32,13 @@ public class DeclaredAdapter extends AdapterAdapter { @Override protected String createAdapter(String typeAdapterName) { - if (TypeHelper.isInstance(typeAdapterClass, Cl.TYPE_ADAPTER.toString(), typeUtils)) { - klazz.addField( - FieldSpec.builder(TypeName.get(typeAdapterClass), typeAdapterName) - .addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) - .initializer("new $T()", typeAdapterClass) - .build() - ); - } else if (TypeHelper.isInstance(typeAdapterClass, Cl.TYPE_ADAPTER_FACTORY.toString(), typeUtils)) { - TypeName typeAdapterType = ParameterizedTypeName.get(Cl.TYPE_ADAPTER, TypeName.get(type).box()); - CodeBlock.Builder block = CodeBlock.builder(); - block.add("new $T().create($T.HOLDER.getGson(), ", typeAdapterClass, Cl.CCORE); - appendFieldTypeToken(false); - block.add(")"); - klazz.addField( - FieldSpec.builder(typeAdapterType, typeAdapterName) - .addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) - .initializer(block.build()) - .build() - ); - } else message.printMessage(Diagnostic.Kind.ERROR, "@JsonAdapter value must by TypeAdapter or TypeAdapterFactory reference.", sourceElement); - return typeAdapterName; + return TypeName.get(typeAdapterClass).toString(); } private static DeclaredType findTypeAdapterClass(List annotations) { for (AnnotationMirror annotation : annotations) { String typeName = annotation.getAnnotationType().toString(); - if (typeName.equals(Cl.JSON_ADAPTER.toString())) { + if (typeName.equals(Cl.GWITH.toString())) { Map elements = annotation.getElementValues(); if (!elements.isEmpty()) { AnnotationValue value = elements.values().iterator().next();