Lines 2879-2882
Link Here
|
2879 |
} |
2879 |
} |
2880 |
return typeSignatures; |
2880 |
return typeSignatures; |
2881 |
} |
2881 |
} |
|
|
2882 |
|
2883 |
/* |
2884 |
* Can throw IllegalArgumentException or ArrayIndexOutOfBoundsException |
2885 |
*/ |
2886 |
public static String toAnchor(char[] methodSignature, String methodName, boolean isVarArgs) { |
2887 |
try { |
2888 |
return new String(toAnchor(methodSignature, methodName.toCharArray(), isVarArgs)); |
2889 |
} catch(IllegalArgumentException e) { |
2890 |
return null; |
2891 |
} |
2892 |
} |
2893 |
private static char[] toAnchor(char[] methodSignature, char[] methodName, boolean isVargArgs) { |
2894 |
int firstParen = CharOperation.indexOf(Signature.C_PARAM_START, methodSignature); |
2895 |
if (firstParen == -1) { |
2896 |
throw new IllegalArgumentException(); |
2897 |
} |
2898 |
|
2899 |
StringBuffer buffer = new StringBuffer(methodSignature.length + 10); |
2900 |
|
2901 |
// selector |
2902 |
if (methodName != null) { |
2903 |
buffer.append(methodName); |
2904 |
} |
2905 |
|
2906 |
// parameters |
2907 |
buffer.append('('); |
2908 |
char[][] pts = Signature.getParameterTypes(methodSignature); |
2909 |
for (int i = 0, max = pts.length; i < max; i++) { |
2910 |
if (i == max - 1) { |
2911 |
appendTypeSignatureForAnchor(pts[i], 0 , buffer, isVargArgs); |
2912 |
} else { |
2913 |
appendTypeSignatureForAnchor(pts[i], 0 , buffer, false); |
2914 |
} |
2915 |
if (i != pts.length - 1) { |
2916 |
buffer.append(','); |
2917 |
buffer.append(' '); |
2918 |
} |
2919 |
} |
2920 |
buffer.append(')'); |
2921 |
char[] result = new char[buffer.length()]; |
2922 |
buffer.getChars(0, buffer.length(), result, 0); |
2923 |
return result; |
2924 |
} |
2925 |
|
2926 |
private static int appendTypeSignatureForAnchor(char[] string, int start, StringBuffer buffer, boolean isVarArgs) { |
2927 |
// need a minimum 1 char |
2928 |
if (start >= string.length) { |
2929 |
throw new IllegalArgumentException(); |
2930 |
} |
2931 |
char c = string[start]; |
2932 |
if (isVarArgs) { |
2933 |
switch (c) { |
2934 |
case Signature.C_ARRAY : |
2935 |
return appendArrayTypeSignatureForAnchor(string, start, buffer, true); |
2936 |
case Signature.C_RESOLVED : |
2937 |
case Signature.C_TYPE_VARIABLE : |
2938 |
case Signature.C_BOOLEAN : |
2939 |
case Signature.C_BYTE : |
2940 |
case Signature.C_CHAR : |
2941 |
case Signature.C_DOUBLE : |
2942 |
case Signature.C_FLOAT : |
2943 |
case Signature.C_INT : |
2944 |
case Signature.C_LONG : |
2945 |
case Signature.C_SHORT : |
2946 |
case Signature.C_VOID : |
2947 |
case Signature.C_STAR: |
2948 |
case Signature.C_EXTENDS: |
2949 |
case Signature.C_SUPER: |
2950 |
case Signature.C_CAPTURE: |
2951 |
default: |
2952 |
throw new IllegalArgumentException(); // a var args is an array type |
2953 |
} |
2954 |
} else { |
2955 |
switch (c) { |
2956 |
case Signature.C_ARRAY : |
2957 |
return appendArrayTypeSignatureForAnchor(string, start, buffer, false); |
2958 |
case Signature.C_RESOLVED : |
2959 |
return appendClassTypeSignatureForAnchor(string, start, buffer); |
2960 |
case Signature.C_TYPE_VARIABLE : |
2961 |
int e = Util.scanTypeVariableSignature(string, start); |
2962 |
buffer.append(string, start + 1, e - start - 1); |
2963 |
return e; |
2964 |
case Signature.C_BOOLEAN : |
2965 |
buffer.append(BOOLEAN); |
2966 |
return start; |
2967 |
case Signature.C_BYTE : |
2968 |
buffer.append(BYTE); |
2969 |
return start; |
2970 |
case Signature.C_CHAR : |
2971 |
buffer.append(CHAR); |
2972 |
return start; |
2973 |
case Signature.C_DOUBLE : |
2974 |
buffer.append(DOUBLE); |
2975 |
return start; |
2976 |
case Signature.C_FLOAT : |
2977 |
buffer.append(FLOAT); |
2978 |
return start; |
2979 |
case Signature.C_INT : |
2980 |
buffer.append(INT); |
2981 |
return start; |
2982 |
case Signature.C_LONG : |
2983 |
buffer.append(LONG); |
2984 |
return start; |
2985 |
case Signature.C_SHORT : |
2986 |
buffer.append(SHORT); |
2987 |
return start; |
2988 |
case Signature.C_VOID : |
2989 |
buffer.append(VOID); |
2990 |
return start; |
2991 |
case Signature.C_CAPTURE : |
2992 |
return appendCaptureTypeSignatureForAnchor(string, start, buffer); |
2993 |
case Signature.C_STAR: |
2994 |
case Signature.C_EXTENDS: |
2995 |
case Signature.C_SUPER: |
2996 |
return appendTypeArgumentSignatureForAnchor(string, start, buffer); |
2997 |
default : |
2998 |
throw new IllegalArgumentException(); |
2999 |
} |
3000 |
} |
3001 |
} |
3002 |
private static int appendTypeArgumentSignatureForAnchor(char[] string, int start, StringBuffer buffer) { |
3003 |
// need a minimum 1 char |
3004 |
if (start >= string.length) { |
3005 |
throw new IllegalArgumentException(); |
3006 |
} |
3007 |
char c = string[start]; |
3008 |
switch(c) { |
3009 |
case Signature.C_STAR : |
3010 |
return start; |
3011 |
case Signature.C_EXTENDS : |
3012 |
return appendTypeSignatureForAnchor(string, start + 1, buffer, false); |
3013 |
case Signature.C_SUPER : |
3014 |
return appendTypeSignatureForAnchor(string, start + 1, buffer, false); |
3015 |
default : |
3016 |
return appendTypeSignatureForAnchor(string, start, buffer, false); |
3017 |
} |
3018 |
} |
3019 |
private static int appendCaptureTypeSignatureForAnchor(char[] string, int start, StringBuffer buffer) { |
3020 |
// need a minimum 2 char |
3021 |
if (start >= string.length - 1) { |
3022 |
throw new IllegalArgumentException(); |
3023 |
} |
3024 |
char c = string[start]; |
3025 |
if (c != Signature.C_CAPTURE) { |
3026 |
throw new IllegalArgumentException(); |
3027 |
} |
3028 |
return appendTypeArgumentSignatureForAnchor(string, start + 1, buffer); |
3029 |
} |
3030 |
private static int appendArrayTypeSignatureForAnchor(char[] string, int start, StringBuffer buffer, boolean isVarArgs) { |
3031 |
int length = string.length; |
3032 |
// need a minimum 2 char |
3033 |
if (start >= length - 1) { |
3034 |
throw new IllegalArgumentException(); |
3035 |
} |
3036 |
char c = string[start]; |
3037 |
if (c != Signature.C_ARRAY) { |
3038 |
throw new IllegalArgumentException(); |
3039 |
} |
3040 |
|
3041 |
int index = start; |
3042 |
c = string[++index]; |
3043 |
while(c == Signature.C_ARRAY) { |
3044 |
// need a minimum 2 char |
3045 |
if (index >= length - 1) { |
3046 |
throw new IllegalArgumentException(); |
3047 |
} |
3048 |
c = string[++index]; |
3049 |
} |
3050 |
|
3051 |
int e = appendTypeSignatureForAnchor(string, index, buffer, false); |
3052 |
|
3053 |
for(int i = 1, dims = index - start; i < dims; i++) { |
3054 |
buffer.append('[').append(']'); |
3055 |
} |
3056 |
|
3057 |
if (isVarArgs) { |
3058 |
buffer.append('.').append('.').append('.'); |
3059 |
} else { |
3060 |
buffer.append('[').append(']'); |
3061 |
} |
3062 |
return e; |
3063 |
} |
3064 |
private static int appendClassTypeSignatureForAnchor(char[] string, int start, StringBuffer buffer) { |
3065 |
// need a minimum 3 chars "Lx;" |
3066 |
if (start >= string.length - 2) { |
3067 |
throw new IllegalArgumentException(); |
3068 |
} |
3069 |
// must start in "L" or "Q" |
3070 |
char c = string[start]; |
3071 |
if (c != Signature.C_RESOLVED && c != Signature.C_UNRESOLVED) { |
3072 |
throw new IllegalArgumentException(); |
3073 |
} |
3074 |
int p = start + 1; |
3075 |
while (true) { |
3076 |
if (p >= string.length) { |
3077 |
throw new IllegalArgumentException(); |
3078 |
} |
3079 |
c = string[p]; |
3080 |
switch(c) { |
3081 |
case Signature.C_SEMICOLON : |
3082 |
// all done |
3083 |
return p; |
3084 |
case Signature.C_GENERIC_START : |
3085 |
int e = scanGenericEnd(string, p + 1); |
3086 |
// once we hit type arguments there are no more package prefixes |
3087 |
p = e; |
3088 |
break; |
3089 |
case Signature.C_DOT : |
3090 |
buffer.append('.'); |
3091 |
break; |
3092 |
case '/' : |
3093 |
buffer.append('/'); |
3094 |
break; |
3095 |
case Signature.C_DOLLAR : |
3096 |
// once we hit "$" there are no more package prefixes |
3097 |
/** |
3098 |
* Convert '$' in resolved type signatures into '.'. |
3099 |
* NOTE: This assumes that the type signature is an inner type |
3100 |
* signature. This is true in most cases, but someone can define a |
3101 |
* non-inner type name containing a '$'. |
3102 |
*/ |
3103 |
buffer.append('.'); |
3104 |
break; |
3105 |
default : |
3106 |
buffer.append(c); |
3107 |
} |
3108 |
p++; |
3109 |
} |
3110 |
} |
3111 |
private static int scanGenericEnd(char[] string, int start) { |
3112 |
if (string[start] == Signature.C_GENERIC_END) { |
3113 |
return start; |
3114 |
} |
3115 |
int length = string.length; |
3116 |
int balance = 1; |
3117 |
start++; |
3118 |
while (start <= length) { |
3119 |
switch(string[start]) { |
3120 |
case Signature.C_GENERIC_END : |
3121 |
balance--; |
3122 |
if (balance == 0) { |
3123 |
return start; |
3124 |
} |
3125 |
break; |
3126 |
case Signature.C_GENERIC_START : |
3127 |
balance++; |
3128 |
break; |
3129 |
} |
3130 |
start++; |
3131 |
} |
3132 |
return start; |
3133 |
} |
2882 |
} |
3134 |
} |