diff options
author | aclement <aclement> | 2004-10-19 10:37:31 +0000 |
---|---|---|
committer | aclement <aclement> | 2004-10-19 10:37:31 +0000 |
commit | 6beb43faeecff249a33e7d7e2489c6a92a4700fd (patch) | |
tree | b31102f64c9d7a5df4eaea1dfbbcde01f207c8e9 | |
parent | ae186f2bb93f3a7c3834dfd0e6712d10af5fd6c7 (diff) | |
download | aspectj-6beb43faeecff249a33e7d7e2489c6a92a4700fd.tar.gz aspectj-6beb43faeecff249a33e7d7e2489c6a92a4700fd.zip |
Fix for Bugzilla Bug 76096: Anonymous classes unaware of introductions into abstract classes (error can't find type $Local$)
4 files changed, 71 insertions, 1 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 61270166d..83117d409 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 @@ -15,6 +15,7 @@ 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; @@ -156,7 +157,17 @@ public class AjProblemReporter extends ProblemReporter { // 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(); diff --git a/tests/bugs/pr76096/ConcreteClassA.java b/tests/bugs/pr76096/ConcreteClassA.java new file mode 100644 index 000000000..77bbb9ee6 --- /dev/null +++ b/tests/bugs/pr76096/ConcreteClassA.java @@ -0,0 +1,50 @@ +// 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");} +} diff --git a/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java b/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java index 4e0cca88e..6e86caacc 100644 --- a/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java @@ -334,4 +334,8 @@ public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase { 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 diff --git a/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml b/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml index a2684804d..2ec496b35 100644 --- a/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml +++ b/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml @@ -490,3 +490,8 @@ <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> |