import java.lang.reflect.Modifier; | import java.lang.reflect.Modifier; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.List; | |||||
import org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration; | import org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration; | ||||
import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration; | import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration; | ||||
// if we implemented this method by an inter-type declaration, then there is no error | // if we implemented this method by an inter-type declaration, then there is no error | ||||
//??? be sure this is always right | //??? 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(); ) { | for (Iterator i = onTypeX.getInterTypeMungersIncludingSupers().iterator(); i.hasNext(); ) { | ||||
ConcreteTypeMunger m = (ConcreteTypeMunger)i.next(); | ConcreteTypeMunger m = (ConcreteTypeMunger)i.next(); | ||||
ResolvedMember sig = m.getSignature(); | ResolvedMember sig = m.getSignature(); |
// 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)"); | runTest("Optimization of cflow - counters with abstract pointcuts (5)"); | ||||
} | } | ||||
public void test064() { | |||||
runTest("Anonymous classes unaware of introductions into abstract classes"); | |||||
} | |||||
} | } |
<compile files="CounterTest05.java"/> | <compile files="CounterTest05.java"/> | ||||
<run class="CounterTest05"/> | <run class="CounterTest05"/> | ||||
</ajc-test> | </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> |