69
69
* Creates a sensible unresolvedtype from some signature, for example: signature = LIGuard<TT;>; bound = toString=IGuard<T>
70
70
* sig=PIGuard<TT;>; sigErasure=LIGuard; kind=parameterized
72
private static UnresolvedType convertSigToType(String aSignature) {
72
static UnresolvedType convertSigToType(String aSignature) {
73
73
UnresolvedType bound = null;
74
74
int startOfParams = aSignature.indexOf('<');
75
75
if (startOfParams == -1) {
132
132
endOfParams = locateMatchingEndAngleBracket(lastType, startOfParams);
133
133
typeParams = createTypeParams(lastType.substring(startOfParams + 1, endOfParams));
135
StringBuilder s = new StringBuilder();
136
int firstAngleBracket = signature.indexOf('<');
137
s.append("P").append(signature.substring(1, firstAngleBracket));
139
for (UnresolvedType typeParameter : typeParams) {
140
s.append(typeParameter.getSignature());
143
signature = s.toString();//'P' + signature.substring(1);
135
144
return new UnresolvedType(signature, signatureErasure, typeParams);
137
146
// can't replace above with convertSigToType - leads to stackoverflow
185
194
} else if (firstChar == '@') {
187
196
return ResolvedType.MISSING;
197
} else if (firstChar == 'L') {
198
// only an issue if there is also an angle bracket
199
int leftAngleBracket = signature.indexOf('<');
201
if (leftAngleBracket == -1) {
202
return new UnresolvedType(signature);
204
int endOfParams = locateMatchingEndAngleBracket(signature, leftAngleBracket);
205
StringBuffer erasureSig = new StringBuffer(signature);
206
erasureSig.setCharAt(0, 'L');
207
while (leftAngleBracket != -1) {
208
erasureSig.delete(leftAngleBracket, endOfParams + 1);
209
leftAngleBracket = locateFirstBracket(erasureSig);
210
if (leftAngleBracket != -1) {
211
endOfParams = locateMatchingEndAngleBracket(erasureSig, leftAngleBracket);
215
String signatureErasure = erasureSig.toString();
217
// TODO should consider all the intermediate parameterizations as well!
218
// the type parameters of interest are only those that apply to the 'last type' in the signature
219
// if the signature is 'PMyInterface<String>$MyOtherType;' then there are none...
220
String lastType = null;
221
int nestedTypePosition = signature.indexOf("$", endOfParams); // don't look for $ INSIDE the parameters
222
if (nestedTypePosition != -1) {
223
lastType = signature.substring(nestedTypePosition + 1);
225
lastType = new String(signature);
227
leftAngleBracket = lastType.indexOf("<");
228
UnresolvedType[] typeParams = UnresolvedType.NONE;
229
if (leftAngleBracket != -1) {
230
endOfParams = locateMatchingEndAngleBracket(lastType, leftAngleBracket);
231
typeParams = createTypeParams(lastType.substring(leftAngleBracket + 1, endOfParams));
233
StringBuilder s = new StringBuilder();
234
int firstAngleBracket = signature.indexOf('<');
235
s.append("P").append(signature.substring(1, firstAngleBracket));
237
for (UnresolvedType typeParameter : typeParams) {
238
s.append(typeParameter.getSignature());
241
signature = s.toString();//'P' + signature.substring(1);
242
return new UnresolvedType(signature, signatureErasure, typeParams);
189
246
return new UnresolvedType(signature);
225
282
private static UnresolvedType[] createTypeParams(String typeParameterSpecification) {
226
283
String remainingToProcess = typeParameterSpecification;
227
List types = new ArrayList();
284
List<UnresolvedType> types = new ArrayList<UnresolvedType>();
228
285
while (remainingToProcess.length() != 0) {
229
286
int endOfSig = 0;
288
boolean hadAnglies = false;
231
289
boolean sigFound = false; // OPTIMIZE can this be done better?
232
290
for (endOfSig = 0; (endOfSig < remainingToProcess.length()) && !sigFound; endOfSig++) {
233
291
char thisChar = remainingToProcess.charAt(endOfSig);
234
292
switch (thisChar) {
263
types.add(createTypeFromSignature(remainingToProcess.substring(0, endOfSig)));
322
String forProcessing = remainingToProcess.substring(0, endOfSig);
323
if (hadAnglies && forProcessing.charAt(0) == 'L') {
324
forProcessing = "P" + forProcessing.substring(1);
326
types.add(createTypeFromSignature(forProcessing));
264
327
remainingToProcess = remainingToProcess.substring(endOfSig);
266
329
UnresolvedType[] typeParams = new UnresolvedType[types.size()];