eu.toolchain.serializer.processor.annotation.FieldMirror Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tiny-serializer-processor Show documentation
Show all versions of tiny-serializer-processor Show documentation
A processor for the @AutoSerialize annotation
The newest version!
package eu.toolchain.serializer.processor.annotation;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.TypeName;
import eu.toolchain.serializer.processor.AutoSerializeUtils;
import eu.toolchain.serializer.processor.Naming;
import java.util.Optional;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
import javax.lang.model.type.TypeMirror;
import lombok.Data;
@Data
public class FieldMirror {
private final Optional name;
private final Optional fieldName;
private final Optional accessor;
private final boolean useGetter;
private final boolean provided;
private final boolean external;
private final Optional providerName;
public static FieldMirror getFor(
final AutoSerializeUtils utils, final Element element, final AnnotationMirror a
) {
final AnnotationValues values = utils.getElementValuesWithDefaults(element, a);
final Optional name = filterEmpty(values.getString("name").get());
final Optional fieldName = filterEmpty(values.getString("fieldName").get());
final Optional accessor = filterEmpty(values.getString("accessor").get());
final boolean useGetter = values.getBoolean("useGetter").get();
final boolean provided = values.getBoolean("provided").get();
final boolean external = values.getBoolean("external").get();
final Optional providerName = filterEmpty(values.getString("providerName").get());
return new FieldMirror(name, fieldName, accessor, useGetter, provided, external, providerName);
}
private static Optional filterEmpty(final String name) {
if (name.trim().equals("")) {
return Optional.empty();
}
return Optional.of(name);
}
public static FieldMirror defaultInstance(final boolean defaultUseGetter) {
return new FieldMirror(Optional.empty(), Optional.empty(), Optional.empty(), defaultUseGetter,
false, false, Optional.empty());
}
public Optional buildProvidedParameter(
final AutoSerializeUtils utils, final TypeMirror fieldType, final Naming providerNaming,
final String variableName
) {
if (provided) {
final TypeName serializerType = TypeName.get(utils.serializerFor(fieldType));
return Optional.of(
buildProvidedSpec(serializerType, providerName, fieldType, providerNaming));
}
if (external) {
return Optional.of(
ParameterSpec.builder(TypeName.get(fieldType), variableName, Modifier.FINAL).build());
}
return Optional.empty();
}
public static ParameterSpec buildProvidedSpec(
final TypeName serializerType, final Optional providerName, final TypeMirror fieldType,
final Naming naming
) {
final String uniqueProviderName;
if (providerName.isPresent()) {
uniqueProviderName = naming.forName(providerName.get());
} else {
uniqueProviderName = naming.forType(TypeName.get(fieldType), false);
}
return ParameterSpec.builder(serializerType, uniqueProviderName, Modifier.FINAL).build();
}
public FieldSpec buildField(
final AutoSerializeUtils utils, final TypeMirror fieldType, final Naming fieldNaming,
final String variableName
) {
if (external) {
return FieldSpec
.builder(TypeName.get(fieldType), variableName)
.addModifiers(Modifier.FINAL)
.build();
}
final String typeFieldName;
if (provided) {
if (providerName.isPresent()) {
typeFieldName = fieldNaming.forName(providerName.get());
} else {
typeFieldName = fieldNaming.forType(TypeName.get(fieldType), provided);
}
} else {
typeFieldName = fieldNaming.forType(TypeName.get(fieldType), provided);
}
final TypeName serializerType = TypeName.get(utils.serializerFor(fieldType));
return FieldSpec.builder(serializerType, typeFieldName).addModifiers(Modifier.FINAL).build();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy