]> source.dussan.org Git - aspectj.git/commitdiff
164016, 258788: test and fix
authoraclement <aclement>
Tue, 6 Jan 2009 23:53:58 +0000 (23:53 +0000)
committeraclement <aclement>
Tue, 6 Jan 2009 23:53:58 +0000 (23:53 +0000)
org.aspectj.matcher/src/org/aspectj/weaver/MethodDelegateTypeMunger.java
org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java
org.aspectj.matcher/src/org/aspectj/weaver/ResolvedTypeMunger.java

index 3ecac98820f493bcf680f9ffa8f0ec5c9510c48a..a9d0982c0c66cbf715648133c3fa8bc3806835ea 100644 (file)
@@ -10,7 +10,6 @@
  *     Alexandre Vasseur     initial implementation
  * ******************************************************************/
 
-
 package org.aspectj.weaver;
 
 import java.io.DataOutputStream;
@@ -19,184 +18,201 @@ import java.io.IOException;
 import org.aspectj.weaver.patterns.TypePattern;
 
 /**
- * Type munger for @AspectJ ITD declare parents ie with an interface AND an implementation.
- * Given the aspect that has a field public static Interface fieldI = ... // impl.
- * we will weave in the Interface' methods and delegate to the aspect public static field fieldI
- *
- * Note: this munger DOES NOT handles the interface addition to the target classes - a regular Parent kinded munger
- * must be added in coordination.
+ * Type munger for @AspectJ ITD declare parents ie with an interface AND an implementation. Given the aspect that has a field public
+ * static Interface fieldI = ... // impl. we will weave in the Interface' methods and delegate to the aspect public static field
+ * fieldI
+ * 
+ * Note: this munger DOES NOT handles the interface addition to the target classes - a regular Parent kinded munger must be added in
+ * coordination.
  */
 public class MethodDelegateTypeMunger extends ResolvedTypeMunger {
 
-    private final UnresolvedType aspect;
-
-    /**
-     * The mixin impl (no arg ctor)
-     */
-    private final String implClassName;
-
-    /**
-     * Type pattern this munger applies to
-     */
-    private final TypePattern typePattern;
-
-    /**
-     * Construct a new type munger for @AspectJ ITD
-     *
-     * @param signature
-     * @param aspect
-     * @param implClassName
-     * @param typePattern
-     */
-    public MethodDelegateTypeMunger(ResolvedMember signature, UnresolvedType aspect, String implClassName, TypePattern typePattern) {
-        super(MethodDelegate, signature);
-        this.aspect = aspect;
-        this.typePattern = typePattern;
-        this.implClassName = implClassName;
-    }
-
-    public boolean equals(Object other) {
-       if (!(other instanceof MethodDelegateTypeMunger)) return false;
-       MethodDelegateTypeMunger o = (MethodDelegateTypeMunger)other;
-       return ((o.aspect == null) ? (aspect == null ) : aspect.equals(o.aspect))
-                       && ((o.typePattern == null) ? (typePattern == null ) : typePattern.equals(o.typePattern))
-                       && ((o.implClassName == null) ? (implClassName == null) : implClassName.equals(o.implClassName));
-    }
-
-    private volatile int hashCode = 0;
-    public int hashCode() {
-       if (hashCode == 0) {
-               int result = 17;
-           result = 37*result + ((aspect == null) ? 0 : aspect.hashCode());
-           result = 37*result + ((typePattern == null) ? 0 : typePattern.hashCode());
-           result = 37*result + ((implClassName == null) ? 0 : implClassName.hashCode());
-           hashCode = result;
+       private final UnresolvedType aspect;
+
+       private UnresolvedType fieldType;
+
+       /**
+        * The mixin impl (no arg ctor)
+        */
+       private final String implClassName;
+
+       /**
+        * Type pattern this munger applies to
+        */
+       private final TypePattern typePattern;
+
+       /**
+        * Construct a new type munger for @AspectJ ITD
+        * 
+        * @param signature
+        * @param aspect
+        * @param implClassName
+        * @param typePattern
+        */
+       public MethodDelegateTypeMunger(ResolvedMember signature, UnresolvedType aspect, String implClassName, TypePattern typePattern) {
+               super(MethodDelegate2, signature);
+               this.aspect = aspect;
+               this.typePattern = typePattern;
+               this.implClassName = implClassName;
+       }
+
+       public boolean equals(Object other) {
+               if (!(other instanceof MethodDelegateTypeMunger))
+                       return false;
+               MethodDelegateTypeMunger o = (MethodDelegateTypeMunger) other;
+               return ((o.aspect == null) ? (aspect == null) : aspect.equals(o.aspect))
+                               && ((o.typePattern == null) ? (typePattern == null) : typePattern.equals(o.typePattern))
+                               && ((o.implClassName == null) ? (implClassName == null) : implClassName.equals(o.implClassName))
+                               && ((o.fieldType == null ? (fieldType == null) : fieldType.equals(o.fieldType)));
+       }
+
+       private volatile int hashCode = 0;
+
+       public int hashCode() {
+               if (hashCode == 0) {
+                       int result = 17;
+                       result = 37 * result + ((aspect == null) ? 0 : aspect.hashCode());
+                       result = 37 * result + ((typePattern == null) ? 0 : typePattern.hashCode());
+                       result = 37 * result + ((implClassName == null) ? 0 : implClassName.hashCode());
+                       result = 37 * result + ((fieldType == null) ? 0 : fieldType.hashCode());
+                       hashCode = result;
+               }
+               return hashCode;
+       }
+
+       public ResolvedMember getDelegate(ResolvedType targetType) {
+               return AjcMemberMaker.itdAtDeclareParentsField(targetType, fieldType, aspect);
+       }
+
+       public String getImplClassName() {
+               return implClassName;
+       }
+
+       public void write(DataOutputStream s) throws IOException {
+               kind.write(s);
+               signature.write(s);
+               aspect.write(s);
+               s.writeUTF(implClassName);
+               typePattern.write(s);
+               fieldType.write(s);
+       }
+
+       public static ResolvedTypeMunger readMethod(VersionedDataInputStream s, ISourceContext context,
+                       boolean willFindFieldTypeInStream) throws IOException {
+               ResolvedMemberImpl signature = ResolvedMemberImpl.readResolvedMember(s, context);
+               UnresolvedType aspect = UnresolvedType.read(s);
+               String implClassName = s.readUTF();
+               TypePattern tp = TypePattern.read(s, context);
+               MethodDelegateTypeMunger typeMunger = new MethodDelegateTypeMunger(signature, aspect, implClassName, tp);
+               UnresolvedType fieldType = null;
+               if (willFindFieldTypeInStream) {
+                       fieldType = UnresolvedType.read(s);
+               } else {
+                       fieldType = signature.getDeclaringType(); // a guess... that will work in a lot of cases
+               }
+               typeMunger.setFieldType(fieldType);
+               return typeMunger;
+       }
+
+       /**
+        * Match based on given type pattern, only classes can be matched
+        * 
+        * @param matchType
+        * @param aspectType
+        * @return true if match
+        */
+       public boolean matches(ResolvedType matchType, ResolvedType aspectType) {
+               // match only on class
+               if (matchType.isEnum() || matchType.isInterface() || matchType.isAnnotation()) {
+                       return false;
+               }
+
+               return typePattern.matchesStatically(matchType);
+       }
+
+       /**
+        * Needed for reweavable
+        * 
+        * @return true
+        */
+       public boolean changesPublicSignature() {
+               return true;
+       }
+
+       public static class FieldHostTypeMunger extends ResolvedTypeMunger {
+
+               private UnresolvedType aspect;
+
+               /**
+                * Type pattern this munger applies to
+                */
+               private final TypePattern typePattern;
+
+               /**
+                * Construct a new type munger for @AspectJ ITD
+                * 
+                * @param field
+                * @param aspect
+                * @param typePattern
+                */
+               public FieldHostTypeMunger(ResolvedMember field, UnresolvedType aspect, TypePattern typePattern) {
+                       super(FieldHost, field);
+                       this.aspect = aspect;
+                       this.typePattern = typePattern;
+               }
+
+               public boolean equals(Object other) {
+                       if (!(other instanceof FieldHostTypeMunger))
+                               return false;
+                       FieldHostTypeMunger o = (FieldHostTypeMunger) other;
+                       return ((o.aspect == null) ? (aspect == null) : aspect.equals(o.aspect))
+                                       && ((o.typePattern == null) ? (typePattern == null) : typePattern.equals(o.typePattern));
+               }
+
+               public int hashCode() {
+                       int result = 17;
+                       result = 37 * result + ((aspect == null) ? 0 : aspect.hashCode());
+                       result = 37 * result + ((typePattern == null) ? 0 : typePattern.hashCode());
+                       return result;
                }
-           return hashCode;
-    }
-    
-    public ResolvedMember getDelegate(ResolvedType targetType) {
-        return AjcMemberMaker.itdAtDeclareParentsField(
-                targetType,
-                signature.getDeclaringType(),
-                aspect
-        );
-    }
-
-    public String getImplClassName() {
-        return implClassName;
-    }
-
-    public void write(DataOutputStream s) throws IOException {
-        kind.write(s);
-        signature.write(s);
-        aspect.write(s);
-        s.writeUTF(implClassName);
-        typePattern.write(s);
-    }
-
-    public static ResolvedTypeMunger readMethod(VersionedDataInputStream s, ISourceContext context) throws IOException {
-        ResolvedMemberImpl signature = ResolvedMemberImpl.readResolvedMember(s, context);
-        UnresolvedType aspect = UnresolvedType.read(s);
-        String implClassName = s.readUTF();
-        TypePattern tp = TypePattern.read(s, context);
-        return new MethodDelegateTypeMunger(signature, aspect, implClassName, tp);
-    }
-
-    /**
-     * Match based on given type pattern, only classes can be matched
-     *
-     * @param matchType
-     * @param aspectType
-     * @return true if match
-     */
-    public boolean matches(ResolvedType matchType, ResolvedType aspectType) {
-        // match only on class
-        if (matchType.isEnum() || matchType.isInterface() || matchType.isAnnotation()) {
-            return false;
-        }
-
-        return typePattern.matchesStatically(matchType);
-    }
-
-    /**
-     * Needed for reweavable
-     *
-     * @return true
-     */
-    public boolean changesPublicSignature() {
-        return true;
-    }
-
-    public static class FieldHostTypeMunger extends ResolvedTypeMunger {
-
-        private UnresolvedType aspect;
-
-        /**
-         * Type pattern this munger applies to
-         */
-        private final TypePattern typePattern;
-
-        /**
-         * Construct a new type munger for @AspectJ ITD
-         *
-         * @param field
-         * @param aspect
-         * @param typePattern
-         */
-        public FieldHostTypeMunger(ResolvedMember field, UnresolvedType aspect, TypePattern typePattern) {
-            super(FieldHost, field);
-            this.aspect = aspect;
-            this.typePattern = typePattern;
-        }
-
-        public boolean equals(Object other) {
-               if (!(other instanceof FieldHostTypeMunger)) return false;
-               FieldHostTypeMunger o = (FieldHostTypeMunger)other;
-               return ((o.aspect == null) ? (aspect == null ) : aspect.equals(o.aspect))
-                               && ((o.typePattern == null) ? (typePattern == null ) : typePattern.equals(o.typePattern));
-        }
-
-        public int hashCode() {
-               int result = 17;
-           result = 37*result + ((aspect == null) ? 0 : aspect.hashCode());
-           result = 37*result + ((typePattern == null) ? 0 : typePattern.hashCode());
-           return result;
-        }
-        
-        public void write(DataOutputStream s) throws IOException {
-            kind.write(s);
-            signature.write(s);
-            aspect.write(s);
-            typePattern.write(s);
-        }
-
-        public static ResolvedTypeMunger readFieldHost(VersionedDataInputStream s, ISourceContext context) throws IOException {
-            ResolvedMemberImpl signature = ResolvedMemberImpl.readResolvedMember(s, context);
-            UnresolvedType aspect = UnresolvedType.read(s);
-            TypePattern tp = TypePattern.read(s, context);
-            return new FieldHostTypeMunger(signature, aspect, tp);
-        }
-
-        /**
-         * Match based on given type pattern, only classes can be matched
-         *
-         * @param matchType
-         * @param aspectType
-         * @return true if match
-         */
-        public boolean matches(ResolvedType matchType, ResolvedType aspectType) {
-            // match only on class
-            if (matchType.isEnum() || matchType.isInterface() || matchType.isAnnotation()) {
-                return false;
-            }
-
-            return typePattern.matchesStatically(matchType);
-        }
-
-        public boolean changesPublicSignature() {
-            return false;
-        }
-
-    }
+
+               public void write(DataOutputStream s) throws IOException {
+                       kind.write(s);
+                       signature.write(s);
+                       aspect.write(s);
+                       typePattern.write(s);
+               }
+
+               public static ResolvedTypeMunger readFieldHost(VersionedDataInputStream s, ISourceContext context) throws IOException {
+                       ResolvedMemberImpl signature = ResolvedMemberImpl.readResolvedMember(s, context);
+                       UnresolvedType aspect = UnresolvedType.read(s);
+                       TypePattern tp = TypePattern.read(s, context);
+                       return new FieldHostTypeMunger(signature, aspect, tp);
+               }
+
+               /**
+                * Match based on given type pattern, only classes can be matched
+                * 
+                * @param matchType
+                * @param aspectType
+                * @return true if match
+                */
+               public boolean matches(ResolvedType matchType, ResolvedType aspectType) {
+                       // match only on class
+                       if (matchType.isEnum() || matchType.isInterface() || matchType.isAnnotation()) {
+                               return false;
+                       }
+
+                       return typePattern.matchesStatically(matchType);
+               }
+
+               public boolean changesPublicSignature() {
+                       return false;
+               }
+
+       }
+
+       public void setFieldType(UnresolvedType fieldType) {
+               this.fieldType = fieldType;
+       }
 }
index eb7806026bd54cf8ba480636de06173a1b4b0f79..e0c2e91ecc1a6561efdbade11c55d5f8b97fa0aa 100644 (file)
@@ -1195,7 +1195,7 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl
                for (Iterator iter = getInterTypeMungersIncludingSupers().iterator(); iter.hasNext();) {
                        ConcreteTypeMunger munger = (ConcreteTypeMunger) iter.next();
                        if (munger.getSignature() != null && munger.getSignature().isAbstract()) { // Rule 1
-                               if (munger.getMunger().getKind() == ResolvedTypeMunger.MethodDelegate) {
+                               if (munger.getMunger().getKind() == ResolvedTypeMunger.MethodDelegate2) {
                                        // ignore for @AJ ITD as munger.getSignature() is the
                                        // interface method hence abstract
                                } else {
index 1a76644f90b884f1430799fb58c1e22e91289213..b53268e00ef7487494d91dc3dedfce537700590d 100644 (file)
@@ -147,9 +147,11 @@ public abstract class ResolvedTypeMunger {
                } else if (kind == Constructor) {
                        return NewConstructorTypeMunger.readConstructor(s, context);
                } else if (kind == MethodDelegate) {
-                       return MethodDelegateTypeMunger.readMethod(s, context);
+                       return MethodDelegateTypeMunger.readMethod(s, context, false);
                } else if (kind == FieldHost) {
                        return MethodDelegateTypeMunger.FieldHostTypeMunger.readFieldHost(s, context);
+               } else if (kind == MethodDelegate2) {
+                       return MethodDelegateTypeMunger.readMethod(s, context, true);
                } else {
                        throw new RuntimeException("unimplemented");
                }
@@ -256,6 +258,8 @@ public abstract class ResolvedTypeMunger {
                                return MethodDelegate;
                        case 10:
                                return FieldHost;
+                       case 11:
+                               return MethodDelegate2;
                        }
                        throw new BCException("bad kind: " + key);
                }
@@ -263,7 +267,7 @@ public abstract class ResolvedTypeMunger {
                public String toString() {
                        // we want MethodDelegate to appear as Method in WeaveInfo messages
                        // TODO we may want something for fieldhost ?
-                       if (MethodDelegate.getName().equals(getName())) {
+                       if (getName().startsWith(MethodDelegate.getName())) {// startsWith will cover MethodDelegate2 as well
                                return Method.toString();
                        } else {
                                return super.toString();
@@ -283,13 +287,15 @@ public abstract class ResolvedTypeMunger {
 
        public static final Kind Parent = new Kind("Parent", 6);
        public static final Kind PerTypeWithinInterface = new Kind("PerTypeWithinInterface", 7); // PTWIMPL not serialized, used during
-                                                                                                                                                                                               // concretization of aspects
+       // concretization of aspects
 
        public static final Kind AnnotationOnType = new Kind("AnnotationOnType", 8); // not serialized
 
        public static final Kind MethodDelegate = new Kind("MethodDelegate", 9);// serialized, @AJ ITDs
        public static final Kind FieldHost = new Kind("FieldHost", 10);// serialized, @AJ ITDs
 
+       public static final Kind MethodDelegate2 = new Kind("MethodDelegate2", 11);// serialized, @AJ ITDs
+
        public static final String SUPER_DISPATCH_NAME = "superDispatch";
 
        public void setSuperMethodsCalled(Set c) {