Browse Source

371684 - wildcard generics unpacking

tags/V1_7_0RC1
Andy Clement 12 years ago
parent
commit
89756cdfe5

+ 16
- 1
org.aspectj.matcher/src/org/aspectj/weaver/TypeFactory.java View File

return new UnresolvedType(signature, signatureErasure, typeParams); return new UnresolvedType(signature, signatureErasure, typeParams);
} }
// can't replace above with convertSigToType - leads to stackoverflow // can't replace above with convertSigToType - leads to stackoverflow
} else if ((firstChar == '?' || firstChar == '*') && signature.length() == 1) {
} else if ((firstChar == '?' || firstChar == '*') && signature.length()==1) {
return WildcardedUnresolvedType.QUESTIONMARK; return WildcardedUnresolvedType.QUESTIONMARK;
} else if (firstChar == '+') { } else if (firstChar == '+') {
// ? extends ... // ? extends ...
case '>': case '>':
anglies--; anglies--;
break; break;
case '*':
if (anglies==0) {
int nextCharPos = endOfSig+1;
if (nextCharPos>=remainingToProcess.length()) {
sigFound=true;
} else {
char nextChar = remainingToProcess.charAt(nextCharPos);
if (!(nextChar=='+' || nextChar=='-')) {
// dont need to set endOfSig as the loop will increment
// it to the right place before it exits
sigFound=true;
}
}
}
break;
case '[': case '[':
if (anglies == 0) { if (anglies == 0) {
// the next char might be a [ or a primitive type ref (BCDFIJSZ) // the next char might be a [ or a primitive type ref (BCDFIJSZ)

+ 39
- 0
tests/src/org/aspectj/systemtest/ajc170/Ajc170Tests.java View File

package org.aspectj.systemtest.ajc170; package org.aspectj.systemtest.ajc170;


import java.io.File; import java.io.File;
import java.util.List;


import junit.framework.Test; import junit.framework.Test;


import org.aspectj.apache.bcel.util.ClassPath;
import org.aspectj.testing.XMLBasedAjcTestCase; import org.aspectj.testing.XMLBasedAjcTestCase;
import org.aspectj.weaver.CrosscuttingMembers;
import org.aspectj.weaver.ReferenceType;
import org.aspectj.weaver.ResolvedMember;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.TypeFactory;
import org.aspectj.weaver.TypeVariable;
import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.World;
import org.aspectj.weaver.bcel.BcelWorld;


/** /**
* @author Andy Clement * @author Andy Clement
*/ */
public class Ajc170Tests extends org.aspectj.testing.XMLBasedAjcTestCase { public class Ajc170Tests extends org.aspectj.testing.XMLBasedAjcTestCase {


public void testGenericsWithTwoTypeParamsOneWildcard() {
UnresolvedType ut;
ut = TypeFactory.createTypeFromSignature("LFoo<**>;");
assertEquals(2,ut.getTypeParameters().length);
ut = TypeFactory.createTypeFromSignature("LFoo<***>;");
assertEquals(3,ut.getTypeParameters().length);
ut = TypeFactory.createTypeFromSignature("LFoo<TP;*+Ljava/lang/String;>;");
assertEquals(2,ut.getTypeParameters().length);

ut = TypeFactory.createTypeFromSignature("LFoo<*+Ljava/lang/String;TP;>;");
assertEquals(2,ut.getTypeParameters().length);
ut = TypeFactory.createTypeFromSignature("LFoo<*+Ljava/lang/String;TP;>;");
assertEquals(2,ut.getTypeParameters().length);
ut = TypeFactory.createTypeFromSignature("LFoo<*TT;>;");
assertEquals(2,ut.getTypeParameters().length);

ut = TypeFactory.createTypeFromSignature("LFoo<[I>;");
assertEquals(1,ut.getTypeParameters().length);
ut = TypeFactory.createTypeFromSignature("LFoo<[I[Z>;");
assertEquals(2,ut.getTypeParameters().length);
}
public void testPerThis() { public void testPerThis() {
runTest("perthis"); runTest("perthis");
} }

Loading…
Cancel
Save