]> source.dussan.org Git - aspectj.git/commitdiff
declares from a parameterized super-aspect are now parameterized before returning...
authoracolyer <acolyer>
Thu, 11 Aug 2005 14:58:10 +0000 (14:58 +0000)
committeracolyer <acolyer>
Thu, 11 Aug 2005 14:58:10 +0000 (14:58 +0000)
weaver/src/org/aspectj/weaver/ReferenceType.java

index a9dcbcf4af33014f1538b5c891001a7b62d56a0f..a26c851bd7a65a955e8c64975cfb13b41b274ad0 100644 (file)
  * ******************************************************************/
 package org.aspectj.weaver;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 
 import org.aspectj.bridge.ISourceLocation;
+import org.aspectj.weaver.patterns.Declare;
 import org.aspectj.weaver.patterns.PerClause;
 
 /**
@@ -52,6 +56,7 @@ public class ReferenceType extends ResolvedType {
        ResolvedMember[] parameterizedFields = null;
        ResolvedMember[] parameterizedPointcuts = null;
        ResolvedType[] parameterizedInterfaces = null;
+       Collection parameterizedDeclares = null;
        
        //??? should set delegate before any use
     public ReferenceType(String signature, World world) {
@@ -360,7 +365,7 @@ public class ReferenceType extends ResolvedType {
 
        public ResolvedMember[] getDeclaredPointcuts() {
                if (parameterizedPointcuts != null) return parameterizedPointcuts;
-               if (isParameterizedType() || isRawType()) {
+               if (isParameterizedType()) {
                        ResolvedMember[] delegatePointcuts = delegate.getDeclaredPointcuts();
                        parameterizedPointcuts = new ResolvedMember[delegatePointcuts.length];
                        for (int i = 0; i < delegatePointcuts.length; i++) {
@@ -372,7 +377,7 @@ public class ReferenceType extends ResolvedType {
                }
        }
        
-       private UnresolvedType[] getTypesForMemberParameterization() {
+       private  UnresolvedType[] getTypesForMemberParameterization() {
                UnresolvedType[] parameters = null;
                if (isParameterizedType()) {
                        parameters = getTypeParameters();
@@ -386,7 +391,7 @@ public class ReferenceType extends ResolvedType {
                }
                return parameters;
        }
-
+       
        public UnresolvedType getRawType() {
                return super.getRawType().resolve(getWorld());
        }
@@ -402,7 +407,24 @@ public class ReferenceType extends ResolvedType {
        }
        
        public PerClause getPerClause() { return delegate.getPerClause(); }
-       protected Collection getDeclares() { return delegate.getDeclares(); }
+       
+       
+       protected Collection getDeclares() {
+               if (parameterizedDeclares != null) return parameterizedDeclares;
+               if (isParameterizedType()) {
+                       Collection genericDeclares = delegate.getDeclares();
+                       parameterizedDeclares = new ArrayList();
+                       Map parameterizationMap = getMemberParameterizationMap();
+                       for (Iterator iter = genericDeclares.iterator(); iter.hasNext();) {
+                               Declare declareStatement = (Declare) iter.next();
+                               parameterizedDeclares.add(declareStatement.parameterizeWith(parameterizationMap));
+                       }
+                       return parameterizedDeclares;
+               } else {
+                       return delegate.getDeclares();
+               }
+       }
+       
        protected Collection getTypeMungers() { return delegate.getTypeMungers(); }
        
        protected Collection getPrivilegedAccesses() { return delegate.getPrivilegedAccesses(); }