From: acolyer Date: Fri, 29 Jul 2005 13:11:20 +0000 (+0000) Subject: changes for initialization and preinitialization join point matching with generic... X-Git-Tag: V1_5_0M3~224 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=1bf54ea183838be7c5ecb1941976e143d6549d9a;p=aspectj.git changes for initialization and preinitialization join point matching with generic and parameterized types. This completes the implementation of these pointcuts. --- 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