feat(serialize-generator): support getters and setters in StaticProcessor
ci/woodpecker/push/woodpecker Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2024-04-23 22:48:02 +02:00
parent 2b4b778a4a
commit d129e6950d
Signed by: Johannes
GPG Key ID: E76429612C2929F4
2 changed files with 48 additions and 11 deletions

View File

@ -9,7 +9,9 @@ import io.gitlab.jfronny.commons.serialize.generator.core.value.*;
import javax.annotation.processing.Messager; import javax.annotation.processing.Messager;
import javax.lang.model.element.Modifier; import javax.lang.model.element.Modifier;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
public class StaticProcessor extends GProcessor { public class StaticProcessor extends GProcessor {
@ -95,11 +97,23 @@ public class StaticProcessor extends GProcessor {
.addStatement("return") .addStatement("return")
.endControlFlow(); .endControlFlow();
Map<Property<?>, Property<?>> altMap = new HashMap<>();
boolean isEmpty = true; boolean isEmpty = true;
for (Property<?> param : properties.names) { 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; 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) { if (isEmpty) {
code.addStatement("reader.skipValue()"); code.addStatement("reader.skipValue()");
@ -108,21 +122,31 @@ public class StaticProcessor extends GProcessor {
.beginControlFlow("while (reader.hasNext())") .beginControlFlow("while (reader.hasNext())")
.beginControlFlow("switch (reader.nextName())"); .beginControlFlow("switch (reader.nextName())");
for (Property<?> param : properties.names) { 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()) { 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); Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
code.add(";\n"); code.add(";\n");
} else { } else {
code.beginControlFlow("case $S ->", getSerializedName(param)) code.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN) .addStatement("reader.nextNull()");
.addStatement("reader.nextNull()") if (param instanceof Property.Field) {
.addStatement("$T.$N = null", self.getTypeName(), param.getName()); code.addStatement("$T.$N = null", self.getTypeName(), param.getName());
code.unindent().add("} else $T.$N = ", 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); Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
code.add(";\n") code.add(";\n");
.endControlFlow();
} }
if (!(param instanceof Property.Field)) code.addStatement("has_$N = true", param.getName());
code.endControlFlow();
} }
code.add("default -> ") code.add("default -> ")
.addStatement("reader.skipValue()"); .addStatement("reader.skipValue()");
@ -130,6 +154,11 @@ public class StaticProcessor extends GProcessor {
code.endControlFlow() code.endControlFlow()
.endControlFlow() .endControlFlow()
.addStatement("reader.endObject()"); .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")) spec.addMethod(extension(MethodSpec.methodBuilder("deserialize"))

View File

@ -6,4 +6,12 @@ import io.gitlab.jfronny.commons.serialize.generator.annotations.GSerializable;
public class Static { public class Static {
public boolean nonStatic; public boolean nonStatic;
public static boolean joe; public static boolean joe;
public static void setNine(boolean nine) {
joe = !nine;
}
public static String getSerde() {
return "serde? " + joe;
}
} }