1package com.xtremelabs.robolectric.bytecode;
2
3import javassist.CtClass;
4
5enum Type {
6    VOID(null, null, "", "", Void.TYPE),
7    BOOLEAN(false, "false", ".booleanValue()", "java.lang.Boolean", Boolean.TYPE),
8    BYTE(0, "0", ".byteValue()", "java.lang.Byte", Byte.TYPE),
9    CHAR(0, "0", ".charValue()", "java.lang.Character", Character.TYPE),
10    SHORT(0, "0", ".shortValue()", "java.lang.Short", Short.TYPE),
11    INT(0, "0", ".intValue()", "java.lang.Integer", Integer.TYPE),
12    LONG(0, "0l", ".longValue()", "java.lang.Long", Long.TYPE),
13    FLOAT(0, "0f", ".floatValue()", "java.lang.Float", Float.TYPE),
14    DOUBLE(0, "0d", ".doubleValue()", "java.lang.Double", Double.TYPE),
15    OBJECT(null, "null", "", null, null);
16
17    Type(Object defaultReturnValue, String defaultReturnString, String unboxString, String nonPrimitiveClassName, Class type) {
18        this.defaultReturnValue = defaultReturnValue;
19        this.defaultReturnString = defaultReturnString;
20        this.unboxString = unboxString;
21        this.nonPrimitiveClassName = nonPrimitiveClassName;
22        this.type = type;
23    }
24
25    private Object defaultReturnValue;
26    private String defaultReturnString;
27    private String unboxString;
28    private String nonPrimitiveClassName;
29    private Class type;
30
31    Object defaultReturnValue() {
32        return defaultReturnValue;
33    }
34
35    String defaultReturnString() {
36        return defaultReturnString;
37    }
38
39    String unboxString() {
40        return unboxString;
41    }
42
43    String nonPrimitiveClassName(CtClass returnCtClass) {
44        return nonPrimitiveClassName == null ? returnCtClass.getName() : nonPrimitiveClassName;
45    }
46
47    boolean isVoid() {
48        return this == VOID;
49    }
50
51    public static Type find(CtClass ctClass) {
52        if (ctClass.equals(CtClass.voidType)) {
53            return VOID;
54        } else if (ctClass.equals(CtClass.booleanType)) {
55            return BOOLEAN;
56        } else if (ctClass.equals(CtClass.byteType)) {
57            return BYTE;
58        } else if (ctClass.equals(CtClass.charType)) {
59            return CHAR;
60        } else if (ctClass.equals(CtClass.shortType)) {
61            return SHORT;
62        } else if (ctClass.equals(CtClass.intType)) {
63            return INT;
64        } else if (ctClass.equals(CtClass.longType)) {
65            return LONG;
66        } else if (ctClass.equals(CtClass.floatType)) {
67            return FLOAT;
68        } else if (ctClass.equals(CtClass.doubleType)) {
69            return DOUBLE;
70        } else if (!ctClass.isPrimitive()) {
71            return OBJECT;
72        } else {
73            throw new RuntimeException("unknown return type " + ctClass);
74        }
75    }
76
77    public static Class findPrimitiveClass(String name) {
78        for (Type type : Type.values()) {
79            if (type.type != null && type.type.getName().equals(name)) {
80                return type.type;
81            }
82        }
83        return null;
84    }
85}
86