fix(serialize-generator): more checks to prevent double declarations
ci/woodpecker/push/woodpecker Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2024-04-24 10:35:03 +02:00
parent 5a9c3ee58f
commit 78ec439ccb
Signed by: Johannes
GPG Key ID: E76429612C2929F4
5 changed files with 126 additions and 126 deletions

View File

@ -50,41 +50,43 @@ public class ArrayAdapter extends Adapter<ArrayAdapter.Hydrated> {
@Override @Override
public void generateRead() { public void generateRead() {
CodeBlock.Builder kode = CodeBlock.builder();
// Coerce
kode.beginControlFlow("if (reader.isLenient() && reader.peek() != $T.BEGIN_ARRAY)", Cl.GSON_TOKEN)
.add("return new $T[] { ", componentType);
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
kode.add(" };\n").endControlFlow();
kode.addStatement("$T<$T> list = new $T<>()", List.class, componentType, ArrayList.class)
.addStatement("reader.beginArray()")
.beginControlFlow("while (reader.hasNext())")
.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
.addStatement("reader.nextNull()")
.addStatement("list.add(null)")
.nextControlFlow("else")
.add("list.add(");
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
kode.add(");\n")
.endControlFlow()
.endControlFlow()
.addStatement("reader.endArray()")
.addStatement("return list.toArray($T[]::new)", componentType);
String methodName = "deserialize$" + name; String methodName = "deserialize$" + name;
klazz.addMethod( if (klazz.methodSpecs.stream().noneMatch(s -> s.name.equals(methodName))) {
MethodSpec.methodBuilder(methodName) CodeBlock.Builder kode = CodeBlock.builder();
.addModifiers(Modifier.PRIVATE, Modifier.STATIC) // Coerce
.returns(typeName) kode.beginControlFlow("if (reader.isLenient() && reader.peek() != $T.BEGIN_ARRAY)", Cl.GSON_TOKEN)
.addTypeVariable(TypeVariableName.get("TEx", Exception.class)) .add("return new $T[] { ", componentType);
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader")))) generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
.addParameter(TypeVariableName.get("Reader"), "reader") kode.add(" };\n").endControlFlow();
.addException(TypeVariableName.get("TEx"))
.addException(Cl.MALFORMED_DATA_EXCEPTION) kode.addStatement("$T<$T> list = new $T<>()", List.class, componentType, ArrayList.class)
.addCode(kode.build()) .addStatement("reader.beginArray()")
.build() .beginControlFlow("while (reader.hasNext())")
); .beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
.addStatement("reader.nextNull()")
.addStatement("list.add(null)")
.nextControlFlow("else")
.add("list.add(");
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
kode.add(");\n")
.endControlFlow()
.endControlFlow()
.addStatement("reader.endArray()")
.addStatement("return list.toArray($T[]::new)", componentType);
klazz.addMethod(
MethodSpec.methodBuilder(methodName)
.addModifiers(Modifier.PRIVATE, Modifier.STATIC)
.returns(typeName)
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
.addParameter(TypeVariableName.get("Reader"), "reader")
.addException(TypeVariableName.get("TEx"))
.addException(Cl.MALFORMED_DATA_EXCEPTION)
.addCode(kode.build())
.build()
);
}
code.add("$N(reader)", methodName); code.add("$N(reader)", methodName);
} }
} }

View File

@ -78,41 +78,43 @@ public class CollectionAdapter extends Adapter<CollectionAdapter.Hydrated> {
@Override @Override
public void generateRead() { public void generateRead() {
CodeBlock.Builder kode = CodeBlock.builder();
kode.addStatement("$T list = new $T<>()", typeName, implType);
// Coerce
kode.beginControlFlow("if (reader.isLenient() && reader.peek() != $T.BEGIN_ARRAY)", Cl.GSON_TOKEN)
.add("list.add(");
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
kode.add(");\n").addStatement("return list").endControlFlow();
kode.addStatement("reader.beginArray()")
.beginControlFlow("while (reader.hasNext())")
.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
.addStatement("reader.nextNull()")
.addStatement("list.add(null)")
.nextControlFlow("else")
.add("list.add(");
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
kode.add(");\n")
.endControlFlow()
.endControlFlow()
.addStatement("reader.endArray()")
.addStatement("return list");
String methodName = "read$" + name; String methodName = "read$" + name;
klazz.addMethod( if (klazz.methodSpecs.stream().noneMatch(s -> s.name.equals(methodName))) {
MethodSpec.methodBuilder(methodName) CodeBlock.Builder kode = CodeBlock.builder();
.addModifiers(Modifier.PRIVATE, Modifier.STATIC) kode.addStatement("$T list = new $T<>()", typeName, implType);
.returns(typeName) // Coerce
.addTypeVariable(TypeVariableName.get("TEx", Exception.class)) kode.beginControlFlow("if (reader.isLenient() && reader.peek() != $T.BEGIN_ARRAY)", Cl.GSON_TOKEN)
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader")))) .add("list.add(");
.addParameter(TypeVariableName.get("Reader"), "reader") generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
.addException(TypeVariableName.get("TEx")) kode.add(");\n").addStatement("return list").endControlFlow();
.addException(Cl.MALFORMED_DATA_EXCEPTION)
.addCode(kode.build()) kode.addStatement("reader.beginArray()")
.build() .beginControlFlow("while (reader.hasNext())")
); .beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
.addStatement("reader.nextNull()")
.addStatement("list.add(null)")
.nextControlFlow("else")
.add("list.add(");
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
kode.add(");\n")
.endControlFlow()
.endControlFlow()
.addStatement("reader.endArray()")
.addStatement("return list");
klazz.addMethod(
MethodSpec.methodBuilder(methodName)
.addModifiers(Modifier.PRIVATE, Modifier.STATIC)
.returns(typeName)
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
.addParameter(TypeVariableName.get("Reader"), "reader")
.addException(TypeVariableName.get("TEx"))
.addException(Cl.MALFORMED_DATA_EXCEPTION)
.addCode(kode.build())
.build()
);
}
code.add("$N(reader)", methodName); code.add("$N(reader)", methodName);
} }
} }

View File

@ -32,15 +32,7 @@ public class DateAdapter extends Adapter<DateAdapter.Hydrated> {
@Override @Override
public void generateRead() { public void generateRead() {
boolean found = false; if (klazz.methodSpecs.stream().noneMatch(s -> s.name.equals("parseDate"))) {
for (MethodSpec spec : klazz.methodSpecs) {
if (spec.name.equals("parseDate")) {
found = true;
break;
}
}
if (!found) {
klazz.addMethod( klazz.addMethod(
MethodSpec.methodBuilder("parseDate") MethodSpec.methodBuilder("parseDate")
.addModifiers(Modifier.PRIVATE, Modifier.STATIC) .addModifiers(Modifier.PRIVATE, Modifier.STATIC)

View File

@ -44,21 +44,23 @@ public class EnumAdapter extends Adapter<EnumAdapter.Hydrated> {
@Override @Override
public void generateRead() { public void generateRead() {
String methodName = "read$" + name; String methodName = "read$" + name;
klazz.addMethod( if (klazz.methodSpecs.stream().noneMatch(s -> s.name.equals(methodName))) {
MethodSpec.methodBuilder(methodName) klazz.addMethod(
.addModifiers(Modifier.PRIVATE, Modifier.STATIC) MethodSpec.methodBuilder(methodName)
.returns(TypeName.get(tel)) .addModifiers(Modifier.PRIVATE, Modifier.STATIC)
.addParameter(String.class, "value") .returns(TypeName.get(tel))
.addCode( .addParameter(String.class, "value")
CodeBlock.builder() .addCode(
.beginControlFlow("for ($1T t : $1T.values())", tel) CodeBlock.builder()
.addStatement("if (t.name().equals(value)) return t") .beginControlFlow("for ($1T t : $1T.values())", tel)
.endControlFlow() .addStatement("if (t.name().equals(value)) return t")
.addStatement("return null") .endControlFlow()
.build() .addStatement("return null")
) .build()
.build() )
); .build()
);
}
code.add("$N(reader.nextString())", methodName); code.add("$N(reader.nextString())", methodName);
} }
} }

View File

@ -156,41 +156,43 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
@Override @Override
public void generateRead() { public void generateRead() {
CodeBlock.Builder kode = CodeBlock.builder();
kode.addStatement("$T map = new $T<>()", typeName, implType);
kode.addStatement("reader.beginObject()")
.beginControlFlow("while (reader.hasNext())")
.addStatement("String name = reader.nextName()")
.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
.addStatement("reader.nextNull()")
.add("map.put(");
generateConvertKey(kode);
kode.addStatement(", null)")
.nextControlFlow("else")
.add("map.put(");
generateConvertKey(kode);
kode.add(", ");
generateRead(kode, componentType2, argName, componentType2.getAnnotationMirrors());
kode.addStatement(")")
.endControlFlow()
.endControlFlow()
.addStatement("reader.endObject()")
.addStatement("return map");
String methodName = "read$" + name; String methodName = "read$" + name;
klazz.addMethod( if (klazz.methodSpecs.stream().noneMatch(s -> s.name.equals(methodName))) {
MethodSpec.methodBuilder(methodName) CodeBlock.Builder kode = CodeBlock.builder();
.addModifiers(Modifier.PRIVATE, Modifier.STATIC) kode.addStatement("$T map = new $T<>()", typeName, implType);
.returns(typeName)
.addTypeVariable(TypeVariableName.get("TEx", Exception.class)) kode.addStatement("reader.beginObject()")
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader")))) .beginControlFlow("while (reader.hasNext())")
.addParameter(TypeVariableName.get("Reader"), "reader") .addStatement("String name = reader.nextName()")
.addException(TypeVariableName.get("TEx")) .beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
.addException(Cl.MALFORMED_DATA_EXCEPTION) .addStatement("reader.nextNull()")
.addCode(kode.build()) .add("map.put(");
.build() generateConvertKey(kode);
); kode.addStatement(", null)")
.nextControlFlow("else")
.add("map.put(");
generateConvertKey(kode);
kode.add(", ");
generateRead(kode, componentType2, argName, componentType2.getAnnotationMirrors());
kode.addStatement(")")
.endControlFlow()
.endControlFlow()
.addStatement("reader.endObject()")
.addStatement("return map");
klazz.addMethod(
MethodSpec.methodBuilder(methodName)
.addModifiers(Modifier.PRIVATE, Modifier.STATIC)
.returns(typeName)
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
.addParameter(TypeVariableName.get("Reader"), "reader")
.addException(TypeVariableName.get("TEx"))
.addException(Cl.MALFORMED_DATA_EXCEPTION)
.addCode(kode.build())
.build()
);
}
code.add("$N(reader)", methodName); code.add("$N(reader)", methodName);
} }
} }