1 11 package org.eclipse.jdi.internal; 12 13 import java.util.ArrayList ; 14 import java.util.Collections ; 15 import java.util.List ; 16 17 20 public class GenericSignature { 21 22 private static final char C_CLASS_TYPE= 'L'; 23 private static final char C_TYPE_VARIABLE= 'T'; 24 private static final char C_ARRAY= '['; 25 private static final char C_WILDCARD_PLUS= '+'; 26 private static final char C_WILDCARD_MINUS= '-'; 27 28 private static final char C_TYPE_END= ';'; 29 private static final char C_PARAMETERS_START= '('; 30 private static final char C_PARAMETERS_END= ')'; 31 private static final char C_TYPE_ARGUMENTS_START= '<'; 32 private static final char C_TYPE_ARGUMENTS_END= '>'; 33 34 public static List getParameterTypes(String methodSignature) { 35 int parameterStart= methodSignature.indexOf(C_PARAMETERS_START); 36 int parametersEnd= methodSignature.lastIndexOf(C_PARAMETERS_END); 37 if (parameterStart == -1 || parametersEnd == -1) { 38 return Collections.EMPTY_LIST; 40 } 41 return getTypeSignatureList(methodSignature.substring(parameterStart + 1, parametersEnd)); 42 } 43 44 private static List getTypeSignatureList(String typeSignatureList) { 45 List list= new ArrayList (); 46 int pos= 0; 47 while (pos < typeSignatureList.length()) { 48 int signatureLength= nextTypeSignatureLength(typeSignatureList, pos); 49 list.add(typeSignatureList.substring(pos, pos+= signatureLength)); 50 } 51 return list; 52 } 53 54 private static int nextTypeSignatureLength(String signature, int startPos) { 55 int inclusionLevel= 0; 56 for (int i= startPos, length= signature.length(); i < length; i++) { 57 if (inclusionLevel == 0) { 58 switch (signature.charAt(i)) { 59 case C_CLASS_TYPE: 60 case C_TYPE_VARIABLE: 61 case C_WILDCARD_PLUS: 62 case C_WILDCARD_MINUS: 63 inclusionLevel= 1; 64 break; 65 case C_ARRAY: 66 break; 67 default: 68 return i - startPos + 1; 69 } 70 } else { 71 switch (signature.charAt(i)) { 72 case C_TYPE_END: 73 if (inclusionLevel == 1) { 74 return i - startPos + 1; 75 } 76 break; 77 case C_TYPE_ARGUMENTS_START: 78 inclusionLevel++; 79 break; 80 case C_TYPE_ARGUMENTS_END: 81 inclusionLevel--; 82 break; 83 } 84 } 85 } 86 throw new IllegalArgumentException (); 87 } 88 } 89 | Popular Tags |