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

70 lines
2.8 KiB
Java
Raw Normal View History

package io.gitlab.jfronny.gson.compile.processor.adapter;
import com.squareup.javapoet.*;
import io.gitlab.jfronny.gson.compile.processor.Const;
2022-11-01 11:38:37 +01:00
import io.gitlab.jfronny.gson.compile.processor.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 11:38:37 +01:00
public abstract class AdapterAdapter extends Adapter {
@Override
public void generateWrite(Runnable writeGet) {
code.add(getAdapter() + ".write(writer, ");
writeGet.run();
code.add(");\n");
}
@Override
public void generateRead() {
code.add(getAdapter() + ".read(reader)");
}
private String getAdapter() {
String typeAdapterName = Const.ADAPTER_PREFIX + property.getName();
for (FieldSpec spec : klazz.fieldSpecs) {
if (spec.name.equals(typeAdapterName)) return typeAdapterName;
}
2022-11-01 11:38:37 +01:00
return createAdapter(typeAdapterName);
}
2022-11-01 11:38:37 +01:00
protected abstract String createAdapter(String name);
protected void appendFieldTypeToken(boolean allowClassType) {
TypeMirror type = property.getType();
TypeName typeName = TypeName.get(type);
2022-11-01 11:38:37 +01:00
if (TypeHelper.isComplexType(type, typeUtils)) {
TypeName typeTokenType = ParameterizedTypeName.get(Const.TYPE_TOKEN, typeName);
2022-11-01 11:38:37 +01:00
List<? extends TypeMirror> typeParams = TypeHelper.getGenericTypes(type);
if (typeParams.isEmpty()) {
2022-11-01 11:38:37 +01:00
code.add("new $T() {}", typeTokenType);
} else {
2022-11-01 11:38:37 +01:00
code.add("($T) $T.getParameterized($T.class, ", typeTokenType, Const.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()));
2022-11-01 11:38:37 +01:00
code.add("(($T)typeToken.getType()).getActualTypeArguments()[$L]", ParameterizedType.class, typeIndex);
if (iterator.hasNext()) {
2022-11-01 11:38:37 +01:00
code.add(", ");
}
}
2022-11-01 11:38:37 +01:00
code.add(")");
}
2022-11-01 11:38:37 +01:00
} else if (TypeHelper.isGenericType(type)) {
TypeName typeTokenType = ParameterizedTypeName.get(Const.TYPE_TOKEN, typeName);
int typeIndex = typeVariables.indexOf(TypeVariableName.get(property.getType().toString()));
2022-11-01 11:38:37 +01:00
code.add("($T) $T.get((($T)typeToken.getType()).getActualTypeArguments()[$L])",
typeTokenType, Const.TYPE_TOKEN, ParameterizedType.class, typeIndex);
} else {
if (allowClassType) {
2022-11-01 11:38:37 +01:00
code.add("$T.class", typeName);
} else {
2022-11-01 11:38:37 +01:00
code.add("TypeToken.get($T.class)", typeName);
}
}
}
}