Home | History | Annotate | Download | only in bytecode
      1 package com.xtremelabs.robolectric.bytecode;
      2 
      3 import javassist.CtClass;
      4 
      5 enum 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