gson-compile/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/adapter/AdapterAdapter.java

70 lines
3.0 KiB
Java
Raw Normal View History

package io.gitlab.jfronny.gson.compile.processor.adapter;
import com.squareup.javapoet.*;
2022-12-14 17:24:57 +01:00
import io.gitlab.jfronny.gson.compile.processor.Cl;
2022-12-14 14:55:45 +01:00
import io.gitlab.jfronny.gson.compile.processor.core.TypeHelper;
2022-11-01 11:38:37 +01:00
import javax.lang.model.type.TypeMirror;
import java.lang.reflect.ParameterizedType;
2022-11-01 11:38:37 +01:00
import java.util.Iterator;
import java.util.List;
2022-11-01 13:48:23 +01:00
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) {
2022-11-24 19:57:20 +01:00
code.add("$L.write(", getAdapter());
2022-11-01 13:48:23 +01:00
writeGet.run();
2022-11-24 19:57:20 +01:00
code.add(", writer);\n");
2022-11-01 13:48:23 +01:00
}
2022-11-01 13:48:23 +01:00
@Override
public void generateRead() {
2022-11-01 23:06:01 +01:00
code.add("$L.read(reader)", getAdapter());
2022-11-01 13:48:23 +01:00
}
2022-11-01 13:48:23 +01:00
private String getAdapter() {
for (FieldSpec spec : klazz.fieldSpecs) {
if (spec.name.equals(adapterName)) return adapterName;
}
return createAdapter(adapterName);
}
2022-11-01 13:48:23 +01:00
protected abstract String createAdapter(String name);
2022-11-01 11:38:37 +01:00
2022-11-01 13:48:23 +01:00
protected void appendFieldTypeToken(boolean allowClassType) {
TypeName typeName = TypeName.get(type);
2022-11-01 13:48:23 +01:00
if (TypeHelper.isComplexType(type, typeUtils)) {
TypeName typeTokenType = ParameterizedTypeName.get(Cl.TYPE_TOKEN, typeName);
List<? extends TypeMirror> typeParams = TypeHelper.getGenericTypes(type);
if (typeParams.isEmpty()) {
2022-11-01 13:48:23 +01:00
code.add("new $T() {}", typeTokenType);
} else {
code.add("($T) $T.getParameterized($T.class, ", typeTokenType, Cl.TYPE_TOKEN, typeUtils.erasure(type));
for (Iterator<? extends TypeMirror> iterator = typeParams.iterator(); iterator.hasNext(); ) {
TypeMirror typeParam = iterator.next();
int typeIndex = typeVariables.indexOf(TypeVariableName.get(typeParam.toString()));
code.add("(($T)typeToken.getType()).getActualTypeArguments()[$L]", ParameterizedType.class, typeIndex);
if (iterator.hasNext()) {
code.add(", ");
}
}
2022-11-01 13:48:23 +01:00
code.add(")");
}
2022-11-01 13:48:23 +01:00
} else if (TypeHelper.isGenericType(type)) {
TypeName typeTokenType = ParameterizedTypeName.get(Cl.TYPE_TOKEN, typeName);
int typeIndex = typeVariables.indexOf(TypeVariableName.get(type.toString()));
code.add("($T) $T.get((($T)typeToken.getType()).getActualTypeArguments()[$L])",
typeTokenType, Cl.TYPE_TOKEN, ParameterizedType.class, typeIndex);
} else {
2022-11-01 13:48:23 +01:00
if (allowClassType) {
code.add("$T.class", typeName);
} else {
code.add("TypeToken.get($T.class)", typeName);
}
}
}
}
}