java-commons/commons-serialize-generator/src/main/java/io/gitlab/jfronny/commons/serialize/generator/adapter/impl/InferredAdapter.java

54 lines
1.7 KiB
Java

package io.gitlab.jfronny.commons.serialize.generator.adapter.impl;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.TypeName;
import io.gitlab.jfronny.commons.serialize.generator.AdapterRef;
import io.gitlab.jfronny.commons.serialize.generator.adapter.AdapterAdapter;
import io.gitlab.jfronny.commons.tuple.Tuple;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import java.util.Set;
public class InferredAdapter extends AdapterAdapter<InferredAdapter.Hydrated> {
@Override
public Hydrated instantiate() {
return new Hydrated();
}
public class Hydrated extends AdapterAdapter<Hydrated>.Hydrated {
private TypeElement typeAdapterClass;
@Override
public boolean applies() {
return typeAdapterClass != null;
}
@Override
protected void afterHydrate() {
var tmp = findTypeAdapterClass(type, refs);
// Ignore nullSafe for now
if (tmp != null) {
this.typeAdapterClass = tmp.left();
}
}
@Override
protected TypeName createAdapter(String typeAdapterName) {
return ClassName.get(typeAdapterClass);
}
private static Tuple<TypeElement, Boolean> findTypeAdapterClass(TypeMirror type, Set<AdapterRef> refs) {
TypeName tn = TypeName.get(type);
for (AdapterRef ref : refs) {
for (TypeMirror target : ref.targets()) {
if (tn.equals(TypeName.get(target))) {
return Tuple.of(ref.in(), ref.nullSafe());
}
}
}
return null;
}
}
}