Default to safe file writing (write-then-move) and fix AdapterAdapter not importing
ci/woodpecker/push/woodpecker Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2023-01-22 15:21:54 +01:00
parent 5294d82318
commit d1d9707add
Signed by: Johannes
GPG Key ID: E76429612C2929F4
7 changed files with 33 additions and 20 deletions

View File

@ -24,7 +24,7 @@ import java.util.stream.Collectors;
@SupportedSourceVersion(SourceVersion.RELEASE_17)
@SupportedAnnotationTypes2({GSerializable.class})
@SupportedOptions({"gsonCompileNoReflect"})
@SupportedOptions({"gsonCompileNoReflect", "gsonCompileDisableSafe"})
public class GsonCompileProcessor extends AbstractProcessor2 {
private Map<ClassName, TypeSpec.Builder> seen;
private InstanceProcessor instanceProcessor;
@ -38,8 +38,9 @@ public class GsonCompileProcessor extends AbstractProcessor2 {
for (Adapter adapter : Adapters.ADAPTERS) {
adapter.init(processingEnv);
}
instanceProcessor = new InstanceProcessor(valueCreator, message, hasManifold);
staticProcessor = new StaticProcessor(valueCreator, message, hasManifold);
boolean gsonCompileDisableSafe = options.containsKey("gsonCompileDisableSafe");
instanceProcessor = new InstanceProcessor(valueCreator, message, hasManifold, gsonCompileDisableSafe);
staticProcessor = new StaticProcessor(valueCreator, message, hasManifold, gsonCompileDisableSafe);
}
@Override

View File

@ -6,31 +6,32 @@ import io.gitlab.jfronny.gson.compile.processor.core.TypeHelper;
import javax.lang.model.type.TypeMirror;
import java.lang.reflect.ParameterizedType;
import java.util.Iterator;
import java.util.List;
import java.util.*;
public abstract class AdapterAdapter<T extends AdapterAdapter<T>.Hydrated> extends Adapter<T> {
public abstract class Hydrated extends Adapter<T>.Hydrated {
@Override
public void generateWrite(Runnable writeGet) {
code.add("$L.write(", getAdapter());
Object adapter = getAdapter();
code.add("$" + (adapter instanceof String ? "L" : "T") + ".write(", adapter);
writeGet.run();
code.add(", writer);\n");
}
@Override
public void generateRead() {
code.add("$L.read(reader)", getAdapter());
Object adapter = getAdapter();
code.add("$" + (adapter instanceof String ? "L" : "T") + ".read(reader)", adapter);
}
private String getAdapter() {
private Object getAdapter() {
for (FieldSpec spec : klazz.fieldSpecs) {
if (spec.name.equals(adapterName)) return adapterName;
}
return createAdapter(adapterName);
}
protected abstract String createAdapter(String name);
protected abstract Object createAdapter(String name);
protected void appendFieldTypeToken(boolean allowClassType) {
TypeName typeName = TypeName.get(type);

View File

@ -31,8 +31,8 @@ public class DeclaredAdapter extends AdapterAdapter<DeclaredAdapter.Hydrated> {
}
@Override
protected String createAdapter(String typeAdapterName) {
return TypeName.get(typeAdapterClass).toString();
protected TypeName createAdapter(String typeAdapterName) {
return TypeName.get(typeAdapterClass);
}
private static DeclaredType findTypeAdapterClass(List<? extends AnnotationMirror> annotations) {

View File

@ -1,5 +1,6 @@
package io.gitlab.jfronny.gson.compile.processor.adapter.impl;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.TypeName;
import io.gitlab.jfronny.gson.compile.processor.SerializableClass;
import io.gitlab.jfronny.gson.compile.processor.adapter.AdapterAdapter;
@ -11,7 +12,7 @@ public class OtherSerializableAdapter extends AdapterAdapter<OtherSerializableAd
}
public class Hydrated extends AdapterAdapter<Hydrated>.Hydrated {
private String adapter;
private ClassName adapter;
@Override
public boolean applies() {
@ -19,7 +20,7 @@ public class OtherSerializableAdapter extends AdapterAdapter<OtherSerializableAd
}
@Override
protected String createAdapter(String name) {
protected ClassName createAdapter(String name) {
return adapter;
}
@ -28,7 +29,7 @@ public class OtherSerializableAdapter extends AdapterAdapter<OtherSerializableAd
for (SerializableClass adapter : other) {
if (TypeName.get(adapter.classElement().asType()).equals(typeName)) {
// Use self-made adapter
this.adapter = adapter.generatedClassName().toString();
this.adapter = adapter.generatedClassName();
}
}
}

View File

@ -23,11 +23,13 @@ public abstract class GProcessor {
private final boolean isStatic;
private final String readStatement;
private final String writeStatement;
private final boolean gsonCompileDisableSafe;
public GProcessor(ValueCreator valueCreator, Messager message, boolean hasManifold, boolean isStatic) {
public GProcessor(ValueCreator valueCreator, Messager message, boolean hasManifold, boolean isStatic, boolean gsonCompileDisableSafe) {
this.valueCreator = valueCreator;
this.message = message;
this.hasManifold = hasManifold;
this.gsonCompileDisableSafe = gsonCompileDisableSafe;
this.isStatic = isStatic;
this.readStatement = isStatic ? "read(reader)" : "return read(reader)";
@ -171,9 +173,17 @@ public abstract class GProcessor {
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addParameter(Path.class, "path")
.addException(IOException.class)
.addCode(CodeBlock.builder().beginControlFlow("try ($1T writer = $2T.newBufferedWriter(path, $3T.CREATE, $3T.WRITE, $3T.TRUNCATE_EXISTING))", BufferedWriter.class, Files.class, StandardOpenOption.class)
.addCode(gsonCompileDisableSafe ? CodeBlock.builder().beginControlFlow("try ($1T writer = $2T.newBufferedWriter(path, $3T.CREATE, $3T.WRITE, $3T.TRUNCATE_EXISTING))", BufferedWriter.class, Files.class, StandardOpenOption.class)
.addStatement(writeStatement)
.endControlFlow()
.build() : CodeBlock.builder()
.addStatement("$T temp = $T.createTempFile($S, $S)", Path.class, Files.class, "gsoncompile-", ".json")
.beginControlFlow("try ($1T writer = $2T.newBufferedWriter(temp, $3T.CREATE, $3T.WRITE, $3T.TRUNCATE_EXISTING))", BufferedWriter.class, Files.class, StandardOpenOption.class)
.addStatement(writeStatement)
.addStatement("$T.move(temp, path, $T.REPLACE_EXISTING)", Files.class, StandardCopyOption.class)
.nextControlFlow("finally")
.addStatement("$T.deleteIfExists(temp)", Files.class)
.endControlFlow()
.build())
.build()
);

View File

@ -15,8 +15,8 @@ import java.util.List;
import java.util.Set;
public class InstanceProcessor extends GProcessor {
public InstanceProcessor(ValueCreator valueCreator, Messager message, boolean hasManifold) {
super(valueCreator, message, hasManifold, false);
public InstanceProcessor(ValueCreator valueCreator, Messager message, boolean hasManifold, boolean gsonCompileDisableSafe) {
super(valueCreator, message, hasManifold, false, gsonCompileDisableSafe);
}
@Override

View File

@ -14,8 +14,8 @@ import java.util.List;
import java.util.Set;
public class StaticProcessor extends GProcessor {
public StaticProcessor(ValueCreator valueCreator, Messager message, boolean hasManifold) {
super(valueCreator, message, hasManifold, true);
public StaticProcessor(ValueCreator valueCreator, Messager message, boolean hasManifold, boolean gsonCompileDisableSafe) {
super(valueCreator, message, hasManifold, true, gsonCompileDisableSafe);
}
@Override