aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-06-01 16:09:28 +0000
committeraclement <aclement>2005-06-01 16:09:28 +0000
commit26f7815e3018b9afcafb92f6d227f76f5017e300 (patch)
treea3fe0948a7aca43170549242ec600c7a42b9f8f4
parente842bdea035f254aefe99f05cd4de2725e7fb37c (diff)
downloadaspectj-26f7815e3018b9afcafb92f6d227f76f5017e300.tar.gz
aspectj-26f7815e3018b9afcafb92f6d227f76f5017e300.zip
GenericsWork: signature parsing made generics aware. Added getDeclaredSignature() - not currently used yet ... may yet prove redundant...
-rw-r--r--weaver/src/org/aspectj/weaver/Member.java58
1 files changed, 46 insertions, 12 deletions
diff --git a/weaver/src/org/aspectj/weaver/Member.java b/weaver/src/org/aspectj/weaver/Member.java
index 3c42fa1a6..1ce59d964 100644
--- a/weaver/src/org/aspectj/weaver/Member.java
+++ b/weaver/src/org/aspectj/weaver/Member.java
@@ -33,6 +33,7 @@ public class Member implements Comparable, AnnotatedElement {
private final String name;
private final TypeX[] parameterTypes;
private final String signature;
+ private final String declaredSignature;
private String paramSignature;
public Member(
@@ -47,11 +48,12 @@ public class Member implements Comparable, AnnotatedElement {
this.modifiers = modifiers;
this.name = name;
this.signature = signature;
+ this.declaredSignature = signature;
if (kind == FIELD) {
this.returnType = TypeX.forSignature(signature);
this.parameterTypes = TypeX.NONE;
} else {
- Object[] returnAndParams = signatureToTypes(signature);
+ Object[] returnAndParams = signatureToTypes(signature,false);
this.returnType = (TypeX) returnAndParams[0];
this.parameterTypes = (TypeX[]) returnAndParams[1];
}
@@ -73,9 +75,11 @@ public class Member implements Comparable, AnnotatedElement {
this.name = name;
this.parameterTypes = parameterTypes;
if (kind == FIELD) {
- this.signature = returnType.getSignature();
+ this.signature = returnType.getRawTypeSignature();
+ this.declaredSignature = returnType.getSignature();
} else {
- this.signature = typesToSignature(returnType, parameterTypes);
+ this.signature = typesToSignature(returnType, parameterTypes,true);
+ this.declaredSignature = typesToSignature(returnType,parameterTypes,false);
}
}
@@ -99,11 +103,12 @@ public class Member implements Comparable, AnnotatedElement {
* @param signature the JVM bytecode method signature string we want to break apart
* @return a pair of TypeX, TypeX[] representing the return types and parameter types.
*/
- public static String typesToSignature(TypeX returnType, TypeX[] paramTypes) {
+ public static String typesToSignature(TypeX returnType, TypeX[] paramTypes, boolean useRawTypes) {
StringBuffer buf = new StringBuffer();
buf.append("(");
for (int i = 0, len = paramTypes.length; i < len; i++) {
- buf.append(paramTypes[i].getSignature());
+ if (paramTypes[i].isParameterized() && useRawTypes) buf.append(paramTypes[i].getRawTypeSignature());
+ else buf.append(paramTypes[i].getSignature());
}
buf.append(")");
buf.append(returnType.getSignature());
@@ -124,7 +129,8 @@ public class Member implements Comparable, AnnotatedElement {
return buf.toString();
}
- /** returns an Object[] pair of TypeX, TypeX[] representing return type,
+ /**
+ * returns an Object[] pair of TypeX, TypeX[] representing return type,
* argument types parsed from the JVM bytecode signature of a method. Yes,
* this should actually return a nice statically-typed pair object, but we
* don't have one of those.
@@ -138,17 +144,42 @@ public class Member implements Comparable, AnnotatedElement {
* @param signature the JVM bytecode method signature string we want to break apart
* @return a pair of TypeX, TypeX[] representing the return types and parameter types.
*/
- private static Object[] signatureToTypes(String sig) {
+ private static Object[] signatureToTypes(String sig,boolean keepParameterizationInfo) {
List l = new ArrayList();
int i = 1;
while (true) {
char c = sig.charAt(i);
- if (c == ')') break;
+ if (c == ')') break; // break out when the hit the ')'
int start = i;
while (c == '[') c = sig.charAt(++i);
if (c == 'L') {
- i = sig.indexOf(';', start) + 1;
- l.add(TypeX.forSignature(sig.substring(start, i)));
+ int nextSemicolon = sig.indexOf(';',start);
+ int firstAngly = sig.indexOf('<',start);
+ if (firstAngly == -1 || firstAngly>nextSemicolon) {
+ i = nextSemicolon + 1;
+ l.add(TypeX.forSignature(sig.substring(start, i)));
+ } else {
+ // generics generics generics
+ // Have to skip to the *correct* ';'
+ boolean endOfSigReached = false;
+ int posn = firstAngly;
+ int genericDepth=0;
+ while (!endOfSigReached) {
+ switch (sig.charAt(posn)) {
+ case '<': genericDepth++;break;
+ case '>': genericDepth--;break;
+ case ';': if (genericDepth==0) endOfSigReached=true;break;
+ default:
+ }
+ posn++;
+ }
+ // posn now points to the correct nextSemicolon :)
+ i=posn;
+ String toProcess = null;
+ toProcess = sig.substring(start,i);
+ TypeX tx = TypeX.forSignature(toProcess);
+ l.add(tx);
+ }
} else {
l.add(TypeX.forSignature(sig.substring(start, ++i)));
}
@@ -166,11 +197,11 @@ public class Member implements Comparable, AnnotatedElement {
return new Member(FIELD, declaring, mods, type, name, TypeX.NONE);
}
public static Member method(TypeX declaring, int mods, String name, String signature) {
- Object[] pair = signatureToTypes(signature);
+ Object[] pair = signatureToTypes(signature,false);
return method(declaring, mods, (TypeX) pair[0], name, (TypeX[]) pair[1]);
}
public static Member pointcut(TypeX declaring, String name, String signature) {
- Object[] pair = signatureToTypes(signature);
+ Object[] pair = signatureToTypes(signature,false);
return pointcut(declaring, 0, (TypeX) pair[0], name, (TypeX[]) pair[1]);
}
@@ -401,6 +432,9 @@ public class Member implements Comparable, AnnotatedElement {
* use getParameterSignature() - it is importnant to choose the right one in the face of covariance.
*/
public String getSignature() { return signature; }
+
+ /** TODO ASC Should return the non-erased version of the signature... untested */
+ public String getDeclaredSignature() { return declaredSignature;}
public int getArity() { return parameterTypes.length; }
/**