public static List<Type> toJimpleDesc(String desc){
  ArrayList<Type> types=new ArrayList<Type>(2);
  int len=desc.length();
  int idx=0;
  all:   while (idx != len) {
    int nrDims=0;
    Type baseType=null;
    this_type:     while (idx != len) {
      char c=desc.charAt(idx++);
switch (c) {
case '(':
case ')':
        continue all;
case '[':
      ++nrDims;
    continue this_type;
case 'Z':
  baseType=BooleanType.v();
break this_type;
case 'B':
baseType=ByteType.v();
break this_type;
case 'C':
baseType=CharType.v();
break this_type;
case 'S':
baseType=ShortType.v();
break this_type;
case 'I':
baseType=IntType.v();
break this_type;
case 'F':
baseType=FloatType.v();
break this_type;
case 'J':
baseType=LongType.v();
break this_type;
case 'D':
baseType=DoubleType.v();
break this_type;
case 'V':
baseType=VoidType.v();
break this_type;
case 'L':
int begin=idx;
while (desc.charAt(++idx) != ';') ;
String cls=desc.substring(begin,idx++);
baseType=RefType.v(toQualifiedName(cls));
break this_type;
default :
throw new AssertionError("Unknown type: " + c);
}
}
if (baseType != null && nrDims > 0) types.add(ArrayType.v(baseType,nrDims));
 else types.add(baseType);
}
return types;
}

public static List < Type > toJimpleDesc ( String desc ) { ArrayList < Type > types = new ArrayList < Type > ( 2 ) ; int len = desc . length ( ) ; int idx = 0 ; all : while ( idx != len ) { int nrDims = 0 ; Type baseType = null ; this_type : while ( idx != len ) { char c = desc . charAt ( idx ++ ) ; switch ( c ) { case '(' : case ')' : continue all ; case '[' : ++ nrDims ; continue this_type ; case 'Z' : baseType = BooleanType . v ( ) ; break this_type ; case 'B' : baseType = ByteType . v ( ) ; break this_type ; case 'C' : baseType = CharType . v ( ) ; break this_type ; case 'S' : baseType = ShortType . v ( ) ; break this_type ; case 'I' : baseType = IntType . v ( ) ; break this_type ; case 'F' : baseType = FloatType . v ( ) ; break this_type ; case 'J' : baseType = LongType . v ( ) ; break this_type ; case 'D' : baseType = DoubleType . v ( ) ; break this_type ; case 'V' : baseType = VoidType . v ( ) ; break this_type ; case 'L' : int begin = idx ; while ( desc . charAt ( ++ idx ) != ';' ) ; String cls = desc . substring ( begin , idx ++ ) ; baseType = RefType . v ( toQualifiedName ( cls ) ) ; break this_type ; default : throw new AssertionError ( "Unknown type: " + c ) ; } } if ( baseType != null && nrDims > 0 ) types . add ( ArrayType . v ( baseType , nrDims ) ) ; else types . add ( baseType ) ; } return types ; }
converts a method signature to a list of types , with the last entry in the returned list denoting the return type .
