diff --git a/commons-serialize-generator/src/main/java/io/gitlab/jfronny/commons/serialize/generator/gprocessor/StaticProcessor.java b/commons-serialize-generator/src/main/java/io/gitlab/jfronny/commons/serialize/generator/gprocessor/StaticProcessor.java index 5dacaf1..c28fc8e 100644 --- a/commons-serialize-generator/src/main/java/io/gitlab/jfronny/commons/serialize/generator/gprocessor/StaticProcessor.java +++ b/commons-serialize-generator/src/main/java/io/gitlab/jfronny/commons/serialize/generator/gprocessor/StaticProcessor.java @@ -9,7 +9,9 @@ import io.gitlab.jfronny.commons.serialize.generator.core.value.*; import javax.annotation.processing.Messager; import javax.lang.model.element.Modifier; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; public class StaticProcessor extends GProcessor { @@ -95,11 +97,23 @@ public class StaticProcessor extends GProcessor { .addStatement("return") .endControlFlow(); + Map, Property> altMap = new HashMap<>(); + boolean isEmpty = true; for (Property param : properties.names) { - if (isIgnored(param) && getAlternative(properties, param) == null) continue; + if (isIgnored(param)) { + Property alt = getAlternative(properties, param); + altMap.put(param, alt); + if (alt == null) continue; + param = alt; + } isEmpty = false; - code.addStatement("$T.$N = $L", self.getTypeName(), param.getName(), TypeHelper.getDefaultValue(param.getType())); + if (param instanceof Property.Field) { + code.addStatement("$T.$N = $L", self.getTypeName(), param.getName(), TypeHelper.getDefaultValue(param.getType())); + } else { + code.addStatement("$T _$N = $L", param.getType(), param.getName(), TypeHelper.getDefaultValue(param.getType())); + code.addStatement("boolean has_$N = false", param.getName()); + } } if (isEmpty) { code.addStatement("reader.skipValue()"); @@ -108,21 +122,31 @@ public class StaticProcessor extends GProcessor { .beginControlFlow("while (reader.hasNext())") .beginControlFlow("switch (reader.nextName())"); for (Property param : properties.names) { - if (isIgnored(param) && getAlternative(properties, param) == null) continue; + if (altMap.containsKey(param)) { + param = altMap.get(param); + if (param == null) continue; + } + code.beginControlFlow("case $S ->", getSerializedName(param)); if (param.getType().getKind().isPrimitive()) { - code.add("case $S -> $T.$N = ", getSerializedName(param), self.getTypeName(), param.getName()); + if (param instanceof Property.Field) code.add("$T.$N = ", self.getTypeName(), param.getName()); + else code.add("_$N = ", param.getName()); Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message); code.add(";\n"); } else { - code.beginControlFlow("case $S ->", getSerializedName(param)) - .beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN) - .addStatement("reader.nextNull()") - .addStatement("$T.$N = null", self.getTypeName(), param.getName()); - code.unindent().add("} else $T.$N = ", self.getTypeName(), param.getName()); + code.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN) + .addStatement("reader.nextNull()"); + if (param instanceof Property.Field) { + code.addStatement("$T.$N = null", self.getTypeName(), param.getName()); + code.unindent().add("} else $T.$N = ", self.getTypeName(), param.getName()); + } else { + code.addStatement("_$N = null", param.getName()); + code.unindent().add("} else _$N = ", param.getName()); + } Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message); - code.add(";\n") - .endControlFlow(); + code.add(";\n"); } + if (!(param instanceof Property.Field)) code.addStatement("has_$N = true", param.getName()); + code.endControlFlow(); } code.add("default -> ") .addStatement("reader.skipValue()"); @@ -130,6 +154,11 @@ public class StaticProcessor extends GProcessor { code.endControlFlow() .endControlFlow() .addStatement("reader.endObject()"); + + for (Property.Setter setter : properties.setters) { + if (isIgnored(setter)) continue; + code.addStatement("if (has_$N) $T.$N(_$N)", setter.getName(), self.getTypeName(), setter.getCallableName(), setter.getName()); + } } spec.addMethod(extension(MethodSpec.methodBuilder("deserialize")) diff --git a/commons-serialize-generator/src/test/java/io/gitlab/jfronny/commons/serialize/generator/test/Static.java b/commons-serialize-generator/src/test/java/io/gitlab/jfronny/commons/serialize/generator/test/Static.java index abb2b33..1e6201c 100644 --- a/commons-serialize-generator/src/test/java/io/gitlab/jfronny/commons/serialize/generator/test/Static.java +++ b/commons-serialize-generator/src/test/java/io/gitlab/jfronny/commons/serialize/generator/test/Static.java @@ -6,4 +6,12 @@ import io.gitlab.jfronny.commons.serialize.generator.annotations.GSerializable; public class Static { public boolean nonStatic; public static boolean joe; + + public static void setNine(boolean nine) { + joe = !nine; + } + + public static String getSerde() { + return "serde? " + joe; + } }