package com.sora.util.akatsuki.analyzers; import static com.sora.util.akatsuki.Utils.toCapitalCase; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.PrimitiveType; import javax.lang.model.type.TypeMirror; import com.sora.util.akatsuki.TransformationContext; import com.sora.util.akatsuki.analyzers.CascadingTypeAnalyzer.DefaultAnalysis; public class PrimitiveTypeAnalyzer extends CascadingTypeAnalyzer<PrimitiveTypeAnalyzer, TypeMirror, DefaultAnalysis> { public enum Type { BOXED, UNBOXED, FOLLOW } private final Type type; public PrimitiveTypeAnalyzer(TransformationContext context, Type type) { super(context); this.type = type == null ? Type.UNBOXED : type; } @Override protected PrimitiveTypeAnalyzer createInstance(TransformationContext context) { return new PrimitiveTypeAnalyzer(context, type); } @Override public DefaultAnalysis createAnalysis(InvocationContext<TypeMirror> context) throws UnknownTypeException { // boxed primitives have different names (at least for int) CharSequence typeName; final TypeMirror refinedMirror = context.field.refinedMirror(); if (refinedMirror instanceof DeclaredType) { // we are boxed typeName = this.type == Type.UNBOXED ? toCapitalCase(types().unboxedType(refinedMirror).getKind().name()) : ((DeclaredType) refinedMirror).asElement().getSimpleName(); } else { // we are unboxed typeName = this.type == Type.BOXED ? types().boxedClass((PrimitiveType) refinedMirror).getSimpleName() : toCapitalCase(refinedMirror.getKind().name()); } String methodName = (suffix != null) ? (typeName.toString() + suffix) : typeName.toString(); return DefaultAnalysis.of(this, methodName, context); } }