package me.august.lumen.compile.resolve.convert.types;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
public class UnboxingConversion extends Conversion {
public UnboxingConversion(Type original, Type target) {
super(original, target);
}
@Override
public void applyConversion(MethodVisitor visitor) {
String methodName = getUnboxingMethod(getOriginal());
visitor.visitMethodInsn(
Opcodes.INVOKEVIRTUAL,
getOriginal().getInternalName(),
methodName,
// e.g. ()I
"()" + getTarget().getDescriptor(),
false
);
}
private static String getUnboxingMethod(Type type) {
switch (type.getClassName()) {
case "java.lang.Integer" : return "intValue";
case "java.lang.Long" : return "longValue";
case "java.lang.Short" : return "shortValue";
case "java.lang.Byte" : return "byteValue";
case "java.lang.Float" : return "floatValue";
case "java.lang.Double" : return "doubleValue";
case "java.lang.Boolean" : return "booleanValue";
case "java.lang.Character" : return "charValue";
default: return null;
}
}
}