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;
// 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);
}