package io.kaif.mobile.retrofit.processor;
import java.util.List;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.SimpleAnnotationValueVisitor7;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
/**
* copy from https://github.com/square/javapoet/pull/268
* delete this file after pull request merge into https://github.com/square/javapoet
*/
public class AnnotationSpecUtil {
public static AnnotationSpec generate(AnnotationMirror annotation) {
TypeElement element = (TypeElement) annotation.getAnnotationType().asElement();
AnnotationSpec.Builder builder = AnnotationSpec.builder(ClassName.get(element));
Visitor visitor = new Visitor(builder);
for (ExecutableElement executableElement : annotation.getElementValues().keySet()) {
String name = executableElement.getSimpleName().toString();
AnnotationValue value = annotation.getElementValues().get(executableElement);
value.accept(visitor, new Entry(name, value));
}
return builder.build();
}
private static class Entry {
final String name;
final AnnotationValue value;
Entry(String name, AnnotationValue value) {
this.name = name;
this.value = value;
}
}
private static class Visitor
extends SimpleAnnotationValueVisitor7<AnnotationSpec.Builder, Entry> {
final AnnotationSpec.Builder builder;
Visitor(AnnotationSpec.Builder builder) {
super(builder);
this.builder = builder;
}
@Override
public AnnotationSpec.Builder visitArray(List<? extends AnnotationValue> vals, Entry entry) {
Visitor visitor = new Visitor(builder);
vals.forEach(val -> val.accept(visitor, new Entry(entry.name, val)));
return builder;
}
@Override
protected AnnotationSpec.Builder defaultAction(Object o, Entry entry) {
return builder.addMember(entry.name, "$L", entry.value);
}
@Override
public AnnotationSpec.Builder visitAnnotation(AnnotationMirror a, Entry entry) {
return builder.addMember(entry.name, "$L", generate(a));
}
@Override
public AnnotationSpec.Builder visitEnumConstant(VariableElement c, Entry entry) {
return builder.addMember(entry.name, "$T.$L", c.asType(), c.getSimpleName());
}
@Override
public AnnotationSpec.Builder visitType(TypeMirror t, Entry entry) {
return builder.addMember(entry.name, "$T.class", t);
}
}
}