2022-11-01 11:18:35 +01:00
|
|
|
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:18:35 +01:00
|
|
|
|
2022-11-01 11:38:37 +01:00
|
|
|
import javax.lang.model.type.TypeMirror;
|
2022-11-01 11:18:35 +01:00
|
|
|
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:18:35 +01:00
|
|
|
|
2022-11-01 11:38:37 +01:00
|
|
|
public abstract class AdapterAdapter extends Adapter {
|
2022-11-01 11:18:35 +01:00
|
|
|
@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:18:35 +01:00
|
|
|
}
|
|
|
|
|
2022-11-01 11:38:37 +01:00
|
|
|
protected abstract String createAdapter(String name);
|
|
|
|
|
|
|
|
protected void appendFieldTypeToken(boolean allowClassType) {
|
2022-11-01 11:18:35 +01:00
|
|
|
TypeMirror type = property.getType();
|
|
|
|
TypeName typeName = TypeName.get(type);
|
|
|
|
|
2022-11-01 11:38:37 +01:00
|
|
|
if (TypeHelper.isComplexType(type, typeUtils)) {
|
2022-11-01 11:18:35 +01:00
|
|
|
TypeName typeTokenType = ParameterizedTypeName.get(Const.TYPE_TOKEN, typeName);
|
2022-11-01 11:38:37 +01:00
|
|
|
List<? extends TypeMirror> typeParams = TypeHelper.getGenericTypes(type);
|
2022-11-01 11:18:35 +01:00
|
|
|
if (typeParams.isEmpty()) {
|
2022-11-01 11:38:37 +01:00
|
|
|
code.add("new $T() {}", typeTokenType);
|
2022-11-01 11:18:35 +01:00
|
|
|
} else {
|
2022-11-01 11:38:37 +01:00
|
|
|
code.add("($T) $T.getParameterized($T.class, ", typeTokenType, Const.TYPE_TOKEN, typeUtils.erasure(type));
|
2022-11-01 11:18:35 +01:00
|
|
|
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);
|
2022-11-01 11:18:35 +01:00
|
|
|
if (iterator.hasNext()) {
|
2022-11-01 11:38:37 +01:00
|
|
|
code.add(", ");
|
2022-11-01 11:18:35 +01:00
|
|
|
}
|
|
|
|
}
|
2022-11-01 11:38:37 +01:00
|
|
|
code.add(")");
|
2022-11-01 11:18:35 +01:00
|
|
|
}
|
2022-11-01 11:38:37 +01:00
|
|
|
} else if (TypeHelper.isGenericType(type)) {
|
2022-11-01 11:18:35 +01:00
|
|
|
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])",
|
2022-11-01 11:18:35 +01:00
|
|
|
typeTokenType, Const.TYPE_TOKEN, ParameterizedType.class, typeIndex);
|
|
|
|
} else {
|
|
|
|
if (allowClassType) {
|
2022-11-01 11:38:37 +01:00
|
|
|
code.add("$T.class", typeName);
|
2022-11-01 11:18:35 +01:00
|
|
|
} else {
|
2022-11-01 11:38:37 +01:00
|
|
|
code.add("TypeToken.get($T.class)", typeName);
|
2022-11-01 11:18:35 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|