ソースを参照

Fix for Bugzilla Bug 76096: Anonymous classes unaware of introductions into abstract classes (error can't find type $Local$)

tags/V1_2_1
aclement 19年前
コミット
6beb43faee

+ 12
- 1
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();

+ 50
- 0
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");}
}

+ 4
- 0
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");
}

}

+ 5
- 0
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>

読み込み中…
キャンセル
保存