import java.lang.reflect.Modifier;
import java.util.Iterator;
+import java.util.List;
import org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration;
import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration;
// if we implemented this method by an inter-type declaration, then there is no error
//??? be sure this is always right
- ResolvedTypeX onTypeX = factory.fromEclipse(type); //abstractMethod.declaringClass);
+ ResolvedTypeX onTypeX = null;
+
+ // If the type is anonymous, look at its supertype
+ if (!type.isAnonymousType()) {
+ onTypeX = factory.fromEclipse(type);
+ } else {
+ // Hmmm. If the ITD is on an interface that is being 'instantiated' using an anonymous type,
+ // we sort it out elsewhere and don't come into this method -
+ // so we don't have to worry about interfaces, just the superclass.
+ onTypeX = factory.fromEclipse(type.superclass()); //abstractMethod.declaringClass);
+ }
for (Iterator i = onTypeX.getInterTypeMungersIncludingSupers().iterator(); i.hasNext(); ) {
ConcreteTypeMunger m = (ConcreteTypeMunger)i.next();
ResolvedMember sig = m.getSignature();
--- /dev/null
+// In the ConcreteClassA.someMethod() method, the creation of the anonymous class should
+// be ok as the ITD ensures that InterfaceA.a2() is implemented.
+
+interface InterfaceA {
+ public void a1();
+ public void a2();
+}
+
+abstract class AbstractClassA implements InterfaceA {
+ public void a1() {
+ System.out.println("AbstractClassA.a()");
+ }
+}
+
+public class ConcreteClassA extends AbstractClassA {
+ public void someMethod() {
+ InterfaceA a = new AbstractClassA() { };
+ a.a2();
+ }
+
+ public static void main(String[]argv) {
+ new ConcreteClassA().someMethod();
+ new concCB().someMethod();
+ }
+}
+
+aspect IntroAspectA {
+ public void AbstractClassA.a2() {
+ System.out.println("AbstractClassA.a2() from IntroAspectA");
+ }
+}
+
+interface IB {
+ public void m2();
+}
+
+abstract class absCB implements IB {
+ public void m1() { }
+}
+
+class concCB extends absCB {
+ public void someMethod() {
+ IB b = new IB() {};
+ b.m2();
+ }
+}
+
+aspect introAspectB {
+ public void IB.m2() {System.err.println("absCB.m1() from IB");}
+}
runTest("Optimization of cflow - counters with abstract pointcuts (5)");
}
+ public void test064() {
+ runTest("Anonymous classes unaware of introductions into abstract classes");
+ }
+
}
\ No newline at end of file
<compile files="CounterTest05.java"/>
<run class="CounterTest05"/>
</ajc-test>
+
+ <ajc-test dir="bugs/pr76096" pr="76096" title="Anonymous classes unaware of introductions into abstract classes">
+ <compile files="ConcreteClassA.java"/>
+ <run class="ConcreteClassA"/>
+ </ajc-test>