]> source.dussan.org Git - aspectj.git/commitdiff
@override fix: previous version didnt cope with abstract ITDs (yuck)
authoraclement <aclement>
Tue, 23 Aug 2005 15:45:05 +0000 (15:45 +0000)
committeraclement <aclement>
Tue, 23 Aug 2005 15:45:05 +0000 (15:45 +0000)
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java

index 7a7f54318b969b96fc67207e80f5ea98f7848685..aa4f4db8a5f3b385196f02f4ef0ff53df1b83f28 100644 (file)
@@ -15,6 +15,7 @@
 
 import java.lang.reflect.Modifier;
 import java.util.Iterator;
+import java.util.List;
 
 import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration;
 import org.aspectj.ajdt.internal.compiler.ast.Proceed;
@@ -342,18 +343,27 @@ public class AjProblemReporter extends ProblemReporter {
        
        // ignore ajc$ methods
        if (new String(method.selector).startsWith("ajc$")) return;
+               ResolvedMember possiblyErroneousRm = factory.makeResolvedMember(method.binding);
        
        ResolvedType onTypeX =  factory.fromEclipse(method.binding.declaringClass);
-       for (Iterator i = onTypeX.getInterTypeMungersIncludingSupers().iterator(); i.hasNext(); ) {
-                       ConcreteTypeMunger m = (ConcreteTypeMunger)i.next();
-                       ResolvedMember sig = m.getSignature();
-                       if (ResolvedType.matches(AjcMemberMaker.interMethod(sig,m.getAspectType(),
-                                               sig.getDeclaringType().resolve(factory.getWorld()).isInterface()),
-                                           factory.makeResolvedMember(method.binding))) {
-                               // match, so dont need to report a problem!
-                               return;
+       // Can't use 'getInterTypeMungersIncludingSupers()' since that will exclude abstract ITDs
+       // on any super classes - so we have to trawl up ourselves.. I wonder if this problem
+       // affects other code in the problem reporter that looks through ITDs...
+       ResolvedType supertypeToLookAt = onTypeX.getSuperclass();
+       while (supertypeToLookAt!=null) {
+               List itMungers = supertypeToLookAt.getInterTypeMungers();
+               for (Iterator i = itMungers.iterator(); i.hasNext(); ) {
+                               ConcreteTypeMunger m = (ConcreteTypeMunger)i.next();
+                               ResolvedMember sig = m.getSignature();
+                               ResolvedMember rm = AjcMemberMaker.interMethod(sig,m.getAspectType(),
+                                               sig.getDeclaringType().resolve(factory.getWorld()).isInterface());
+                               if (ResolvedType.matches(rm,possiblyErroneousRm)) {
+                                       // match, so dont need to report a problem!
+                                       return;
+                               }
                        }
-               }
+               supertypeToLookAt = supertypeToLookAt.getSuperclass();
+       }
        // report the error...
        super.methodMustOverride(method);
     }