From 2c257af099b5fafeae0620a9c9176143be07b707 Mon Sep 17 00:00:00 2001 From: aclement Date: Wed, 5 Mar 2008 23:31:14 +0000 Subject: [PATCH] 221558: test and fix: incorrect abstract method error with generics and ITDs --- .../compiler/problem/AjProblemReporter.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java index 467e9272f..437cfcb83 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java @@ -226,19 +226,36 @@ public class AjProblemReporter extends ProblemReporter { // so we don't have to worry about interfaces, just the superclass. onTypeX = factory.fromEclipse(type.superclass()); //abstractMethod.declaringClass); } + + if (onTypeX.isRawType()) onTypeX = onTypeX.getGenericType(); + for (Iterator i = onTypeX.getInterTypeMungersIncludingSupers().iterator(); i.hasNext(); ) { ConcreteTypeMunger m = (ConcreteTypeMunger)i.next(); ResolvedMember sig = m.getSignature(); if (!Modifier.isAbstract(sig.getModifiers())) { - if (ResolvedType - .matches( - AjcMemberMaker.interMethod( - sig, - m.getAspectType(), - sig.getDeclaringType().resolve(factory.getWorld()).isInterface()), - factory.makeResolvedMember(abstractMethod))) { - return; - } + ResolvedMember abstractMember = factory.makeResolvedMember(abstractMethod); + if (abstractMember.getName().startsWith("ajc$interMethodDispatch")) { + if (ResolvedType + .matches( + AjcMemberMaker.interMethod( + sig, + m.getAspectType(), + sig.getDeclaringType().resolve(factory.getWorld()).isInterface()), + abstractMember + )) { + return; + } + } else { + // In this case we have something like: + // interface I {} + // abstract class C implements I { abstract void foo();} + // class D extends C {} + // ITD: public void I.foo() {...} + // The ITD is providing the implementation of foo in the class D but when checking for whether the abstract + // method is overridden, we won't be looking at whether the ITD overrides ajc$interMethodDispath$...foo but + // whether it overrides the foo method from class C + if (ResolvedType.matches(sig,factory.makeResolvedMember(abstractMethod))) return; + } } } -- 2.39.5