summaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authoracolyer <acolyer>2005-07-29 13:11:20 +0000
committeracolyer <acolyer>2005-07-29 13:11:20 +0000
commit1bf54ea183838be7c5ecb1941976e143d6549d9a (patch)
tree09c8b1a9f5716fd586ddf247c4c53ff6cc659f44 /weaver
parent42fc0becde4ce2fca4b20d0d9e1f70127b6d7f42 (diff)
downloadaspectj-1bf54ea183838be7c5ecb1941976e143d6549d9a.tar.gz
aspectj-1bf54ea183838be7c5ecb1941976e143d6549d9a.zip
changes for initialization and preinitialization join point matching with generic and parameterized types. This completes the implementation of these pointcuts.
Diffstat (limited to 'weaver')
-rw-r--r--weaver/src/org/aspectj/weaver/WeaverMessages.java2
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelMethod.java5
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/KindedPointcut.java19
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java10
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java7
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java2
-rw-r--r--weaver/src/org/aspectj/weaver/weaver-messages.properties4
7 files changed, 43 insertions, 6 deletions
diff --git a/weaver/src/org/aspectj/weaver/WeaverMessages.java b/weaver/src/org/aspectj/weaver/WeaverMessages.java
index 181ef2620..00d40632d 100644
--- a/weaver/src/org/aspectj/weaver/WeaverMessages.java
+++ b/weaver/src/org/aspectj/weaver/WeaverMessages.java
@@ -136,6 +136,8 @@ public class WeaverMessages {
public static final String WITHIN_PCD_DOESNT_SUPPORT_PARAMETERS="noParameterizedTypePatternInWithin";
public static final String THIS_AND_TARGET_DONT_SUPPORT_PARAMETERS="noParameterizedTypesInThisAndTarget";
public static final String GET_AND_SET_DONT_SUPPORT_DEC_TYPE_PARAMETERS="noParameterizedTypesInGetAndSet";
+ public static final String NO_INIT_JPS_FOR_PARAMETERIZED_TYPES = "noInitJPsForParameterizedTypes";
+ public static final String NO_GENERIC_THROWABLES = "noGenericThrowables";
public static String format(String key) {
return bundle.getString(key);
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelMethod.java b/weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
index 88a876597..140de2ea0 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
@@ -274,11 +274,12 @@ final class BcelMethod extends ResolvedMember {
canBeParameterized = true;
}
Signature.ClassSignature genericTypeSig = bcelObjectType.getGenericClassTypeSignature();
+ Signature.FormalTypeParameter[] parentFormals = (genericTypeSig != null ? genericTypeSig.formalTypeParameters : new Signature.FormalTypeParameter[0]);
Signature.FormalTypeParameter[] formals = new
- Signature.FormalTypeParameter[genericTypeSig.formalTypeParameters.length + mSig.formalTypeParameters.length];
+ Signature.FormalTypeParameter[parentFormals.length + mSig.formalTypeParameters.length];
// put method formal in front of type formals for overriding in lookup
System.arraycopy(mSig.formalTypeParameters,0,formals,0,mSig.formalTypeParameters.length);
- System.arraycopy(genericTypeSig.formalTypeParameters,0,formals,mSig.formalTypeParameters.length,genericTypeSig.formalTypeParameters.length);
+ System.arraycopy(parentFormals,0,formals,mSig.formalTypeParameters.length,parentFormals.length);
Signature.TypeSignature returnTypeSignature = mSig.returnType;
genericReturnType = BcelGenericSignatureToTypeXConverter.typeSignature2TypeX(
returnTypeSignature, formals,
diff --git a/weaver/src/org/aspectj/weaver/patterns/KindedPointcut.java b/weaver/src/org/aspectj/weaver/patterns/KindedPointcut.java
index 22757385f..7bfd08635 100644
--- a/weaver/src/org/aspectj/weaver/patterns/KindedPointcut.java
+++ b/weaver/src/org/aspectj/weaver/patterns/KindedPointcut.java
@@ -323,6 +323,25 @@ public class KindedPointcut extends Pointcut {
getSourceLocation()));
}
}
+
+ // no join points for initialization and preinitialization of parameterized types
+ // no throwable parameterized types
+ if ((kind == Shadow.Initialization) || (kind == Shadow.PreInitialization)) {
+ HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor
+ visitor = new HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor();
+ signature.getDeclaringType().traverse(visitor, null);
+ if (visitor.wellHasItThen/*?*/()) {
+ scope.message(MessageUtil.error(WeaverMessages.format(WeaverMessages.NO_INIT_JPS_FOR_PARAMETERIZED_TYPES),
+ getSourceLocation()));
+ }
+
+ visitor = new HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor();
+ signature.getThrowsPattern().traverse(visitor, null);
+ if (visitor.wellHasItThen/*?*/()) {
+ scope.message(MessageUtil.error(WeaverMessages.format(WeaverMessages.NO_GENERIC_THROWABLES),
+ getSourceLocation()));
+ }
+ }
}
public void resolveBindingsFromRTTI() {
diff --git a/weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java b/weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java
index 3eb71653b..aa13f6726 100644
--- a/weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java
@@ -249,7 +249,10 @@ public class SignaturePattern extends PatternNode {
}
} else {
// fail if there is no erasure as the params don't match
- return false;
+ // try the true (generic) parameter types then
+ if (!parameterTypes.matches(world.resolve(sig.getGenericParameterTypes()),TypePattern.STATIC).alwaysTrue()) {
+ return false;
+ }
}
}
@@ -270,7 +273,10 @@ public class SignaturePattern extends PatternNode {
return declaringTypeMatchAllowingForCovariance(member,world,returnType,sig.getReturnType().resolve(world));
} else if (kind == Member.CONSTRUCTOR) {
if (!parameterTypes.matches(world.resolve(sig.getParameterTypes()), TypePattern.STATIC).alwaysTrue()) {
- return false;
+ // try generic before giving up
+ if (!parameterTypes.matches(world.resolve(sig.getGenericParameterTypes()), TypePattern.STATIC).alwaysTrue()) {
+ return false;
+ }
}
// If we have matched on parameters, let's just check it isn't because the last parameter in the pattern
diff --git a/weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java b/weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java
index d373f22ca..9a006ac47 100644
--- a/weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java
@@ -155,4 +155,11 @@ public class ThrowsPattern extends PatternNode {
public Object accept(PatternNodeVisitor visitor, Object data) {
return visitor.visit(this, data);
}
+
+ public Object traverse(PatternNodeVisitor visitor, Object data) {
+ Object ret = accept(visitor,data);
+ forbidden.traverse(visitor, data);
+ required.traverse(visitor, data);
+ return ret;
+ }
}
diff --git a/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java
index 4260ad975..834168bfb 100644
--- a/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java
@@ -813,7 +813,7 @@ public class WildTypePattern extends TypePattern {
if (genericType == null) {
// issue message "does not match because baseType.getName() is not generic"
scope.message(MessageUtil.warn(
- WeaverMessages.format(WeaverMessages.NOT_A_GENERIC_TYPE,genericType.getName()),
+ WeaverMessages.format(WeaverMessages.NOT_A_GENERIC_TYPE,baseType.getName()),
getSourceLocation()));
return false;
}
diff --git a/weaver/src/org/aspectj/weaver/weaver-messages.properties b/weaver/src/org/aspectj/weaver/weaver-messages.properties
index ed4ac0b11..c2a8b29d0 100644
--- a/weaver/src/org/aspectj/weaver/weaver-messages.properties
+++ b/weaver/src/org/aspectj/weaver/weaver-messages.properties
@@ -146,4 +146,6 @@ notAGenericType=Type pattern does not match because {0} is not a generic type
noStaticInitJPsForParameterizedTypes=no static initialization join points for parameterized types, use raw type instead
noParameterizedTypePatternInWithin=parameterized type pattern not supported by 'within', use a raw type pattern instead
noParameterizedTypesInThisAndTarget=parameterized types not supported for this and target pointcuts (erasure limitation)
-noParameterizedTypesInGetAndSet=can't use parameterized type patterns for the declaring type of a get or set pointcut expression (use the raw type instead) \ No newline at end of file
+noParameterizedTypesInGetAndSet=can't use parameterized type patterns for the declaring type of a get or set pointcut expression (use the raw type instead)
+noInitJPsForParameterizedTypes=no [pre]initialization join points for parameterized types, use raw type instead
+noGenericThrowables=invalid throws pattern: a generic class may not be a direct or indirect subclass of Throwable \ No newline at end of file