]> source.dussan.org Git - aspectj.git/commitdiff
changes for initialization and preinitialization join point matching with generic...
authoracolyer <acolyer>
Fri, 29 Jul 2005 13:11:20 +0000 (13:11 +0000)
committeracolyer <acolyer>
Fri, 29 Jul 2005 13:11:20 +0000 (13:11 +0000)
weaver/src/org/aspectj/weaver/WeaverMessages.java
weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
weaver/src/org/aspectj/weaver/patterns/KindedPointcut.java
weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java
weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java
weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java
weaver/src/org/aspectj/weaver/weaver-messages.properties

index 181ef262099ae87fab0bc2cdb97ba22a5faeff65..00d40632d478b4bafe727bda5ec2ca2b414fd66d 100644 (file)
@@ -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);
index 88a8765975590141bec94f4b56187fab61b3aa77..140de2ea04205468e860fdcc6c6653754d052eb8 100644 (file)
@@ -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,
index 22757385f996b47006e70d2f0efc8627bce88c12..7bfd0863539f434ded8102526dabcfdd7e3b436e 100644 (file)
@@ -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() {
index 3eb71653bd35ac3de36a88c6ab6c23e73abd3d1d..aa13f67269022d692c2f07c4bacae9cd938ddd52 100644 (file)
@@ -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
index d373f22ca9339620573d5c6283cdfdd54317d630..9a006ac470022aa864263d04096a7848a55d03f1 100644 (file)
@@ -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;
+    }
 }
index 4260ad975204eee2d65bc62d7e4a39bf5a79d651..834168bfbd403763e35a29616ac18eb07050d47b 100644 (file)
@@ -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;
                }
index ed4ac0b116056f68b573d60983884db0c62476a0..c2a8b29d0de3eb20279a80204a8f61d09aa87b27 100644 (file)
@@ -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