Ver código fonte

Fix for Bugzilla Bug 49784

 	declaring interface methods should work as it does in interface
and Bugzilla Bug 45676 	
 	AspectJ enhanced code can not be used with plain old java anymo
and Bugzilla Bug 43972 	
 	Static crosscutting makes interfaces unusable for javac
tags/v_preCompileLoopAlteration
acolyer 20 anos atrás
pai
commit
5c4db9cb62

+ 17
- 10
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java Ver arquivo

import org.aspectj.ajdt.internal.compiler.ast.Proceed; import org.aspectj.ajdt.internal.compiler.ast.Proceed;
import org.aspectj.ajdt.internal.compiler.lookup.EclipseFactory; import org.aspectj.ajdt.internal.compiler.lookup.EclipseFactory;
import org.aspectj.util.FuzzyBoolean; import org.aspectj.util.FuzzyBoolean;
import org.aspectj.weaver.AjcMemberMaker;
import org.aspectj.weaver.ConcreteTypeMunger; import org.aspectj.weaver.ConcreteTypeMunger;
import org.aspectj.weaver.ResolvedMember; import org.aspectj.weaver.ResolvedMember;
import org.aspectj.weaver.ResolvedTypeX; import org.aspectj.weaver.ResolvedTypeX;
public class AjProblemReporter extends ProblemReporter { public class AjProblemReporter extends ProblemReporter {
private static final boolean DUMP_STACK = false; private static final boolean DUMP_STACK = false;
public EclipseFactory world;
public EclipseFactory factory;


public AjProblemReporter( public AjProblemReporter(
IErrorHandlingPolicy policy, IErrorHandlingPolicy policy,
TypeBinding exceptionType, TypeBinding exceptionType,
ASTNode location) ASTNode location)
{ {
if (!world.getWorld().getDeclareSoft().isEmpty()) {
Shadow callSite = world.makeShadow(location, referenceContext);
Shadow enclosingExec = world.makeShadow(referenceContext);
if (!factory.getWorld().getDeclareSoft().isEmpty()) {
Shadow callSite = factory.makeShadow(location, referenceContext);
Shadow enclosingExec = factory.makeShadow(referenceContext);
// System.err.println("about to show error for unhandled exception: " + new String(exceptionType.sourceName()) + // System.err.println("about to show error for unhandled exception: " + new String(exceptionType.sourceName()) +
// " at " + location + " in " + referenceContext); // " at " + location + " in " + referenceContext);
for (Iterator i = world.getWorld().getDeclareSoft().iterator(); i.hasNext(); ) {
for (Iterator i = factory.getWorld().getDeclareSoft().iterator(); i.hasNext(); ) {
DeclareSoft d = (DeclareSoft)i.next(); DeclareSoft d = (DeclareSoft)i.next();
// We need the exceptionType to match the type in the declare soft statement // We need the exceptionType to match the type in the declare soft statement
// This means it must either be the same type or a subtype // This means it must either be the same type or a subtype
ResolvedTypeX throwException = world.fromEclipse((ReferenceBinding)exceptionType);
ResolvedTypeX throwException = factory.fromEclipse((ReferenceBinding)exceptionType);
FuzzyBoolean isExceptionTypeOrSubtype = FuzzyBoolean isExceptionTypeOrSubtype =
d.getException().matchesInstanceof(throwException); d.getException().matchesInstanceof(throwException);
if (!isExceptionTypeOrSubtype.alwaysTrue() ) continue; if (!isExceptionTypeOrSubtype.alwaysTrue() ) continue;
return; return;
} }
// 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 = world.fromEclipse(type); //abstractMethod.declaringClass);
ResolvedTypeX onTypeX = factory.fromEclipse(type); //abstractMethod.declaringClass);
for (Iterator i = onTypeX.getInterTypeMungers().iterator(); i.hasNext(); ) { for (Iterator i = onTypeX.getInterTypeMungers().iterator(); i.hasNext(); ) {
ConcreteTypeMunger m = (ConcreteTypeMunger)i.next(); ConcreteTypeMunger m = (ConcreteTypeMunger)i.next();
if (m.matches(onTypeX)) { if (m.matches(onTypeX)) {
ResolvedMember sig = m.getSignature(); ResolvedMember sig = m.getSignature();
if (Modifier.isPublic(sig.getModifiers()) && !Modifier.isAbstract(sig.getModifiers())) {
if (ResolvedTypeX.matches(sig, world.makeResolvedMember(abstractMethod))) {
if (!Modifier.isAbstract(sig.getModifiers())) {
if (ResolvedTypeX
.matches(
AjcMemberMaker.interMethod(
sig,
m.getAspectType(),
sig.getDeclaringType().isInterface(
factory.getWorld())),
EclipseFactory.makeResolvedMember(abstractMethod))) {
return; return;
} }
} }

+ 1
- 1
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java Ver arquivo

// ew.setLint(bcelWorld.getLint()); // ew.setLint(bcelWorld.getLint());
// ew.setXnoInline(buildConfig.isXnoInline()); // ew.setXnoInline(buildConfig.isXnoInline());
le.factory = factory; le.factory = factory;
pr.world = factory;
pr.factory = factory;
le.factory.buildManager = this; le.factory.buildManager = this;
compiler.lookupEnvironment = le; compiler.lookupEnvironment = le;

+ 114
- 0
tests/ajcTests.xml Ver arquivo

</compile> </compile>
<run class="AfterThrowingCtor"/> <run class="AfterThrowingCtor"/>
</ajc-test> </ajc-test>
<ajc-test dir="bugs/abstractMethods" pr="49784"
title="Introduced abstract method on abstract class not implemented by subtype">
<compile files="abstractClass/C.java"
aspectpath="abstractClass/jars/AandB.jar">
<message kind="error" line="1"/>
</compile>
</ajc-test>

<ajc-test dir="bugs/abstractMethods" pr="49784"
title="Introduced abstract method on interface not implemented by subtype (weave altogether)">
<compile files="interface/C.java,interface/A.java,interface/B.java" />
<run class="C"/>
</ajc-test>
<ajc-test dir="bugs/abstractMethods" pr="49784"
title="Introduced abstract method on interface not implemented by subtype (injars)">
<compile files="interface/C.java,interface/jars/AandB.jar">
<message kind="error" line="1"/>
</compile>
</ajc-test>
<ajc-test dir="bugs/abstractMethods" pr="49784"
title="Introduced abstract method on interface not implemented by subtype (aspectpath)">
<compile files="interface/C.java"
aspectpath="interface/jars/AandB.jar" />
<run class="C"/>
</ajc-test>
<ajc-test dir="bugs/abstractMethods" pr="49784"
title="Introduced abstract method on abstract class not implemented by subtype (single source file)">
<compile files="singlesource/C.java">
<message kind="error" line="9"/>
</compile>
</ajc-test>

<ajc-test dir="bugs/abstractMethods" pr="49784"
title="Introduced abstract method on abstract class with introduced concrete method (single source file)">
<compile files="singlesource/C1.java"/>
<run class="C1"/>
</ajc-test>

<ajc-test dir="bugs/abstractMethods" pr="49784"
title="Introduced abstract method on abstract class with existing concrete method (single source file)">
<compile files="singlesource/C2.java"/>
<run class="C2"/>
</ajc-test>

<ajc-test dir="bugs/interAbstract"
pr="49784"
title="aspect declares interface method (no modifiers)">
<compile files="InterfaceMethodDeclarationNone.java" >
<message kind="error" line="32" text="requires a body" />
</compile>
</ajc-test>
<ajc-test dir="bugs/interAbstract"
pr="49784"
title="aspect declares interface method (abstract)">
<compile files="InterfaceMethodDeclarationAbstract.java">
<message kind="error" line="40" text="must implement" />
</compile>
</ajc-test>

<ajc-test dir="bugs/interAbstract"
pr="49784"
comment="working in 1.1.1 - keep with others?"
title="aspect declares interface method (public abstract)">
<compile files="InterfaceMethodDeclarationFull.java" />
<run class="InterfaceMethodDeclarationFull"/>
</ajc-test>

<ajc-test dir="bugs/interfaceDefinition"
pr="43972"
title="Use class implementing interface via aspect (not woven together)">
<compile
files="pack/DefineInterface.java,
pack/InterfaceDefinition.java,
pack/MyInterface.java"/>
<run class="pack.InterfaceDefinition"/>
<compile
includeClassesDir="true"
files="Main.java">
<message kind="error" line="3"/>
</compile>
</ajc-test>
<ajc-test dir="bugs/interfaceDefinition"
pr="43972"
title="Use class implementing interface via aspect (weave all together)">
<compile
files="pack/DefineInterface.java,
pack/InterfaceDefinition.java,
pack/MyInterface.java,
Main.java"/>
<run class="pack.InterfaceDefinition"/>
<run class="Main"/>
</ajc-test>
<ajc-test dir="bugs/interfaceDefinition"
pr="43972"
title="Use class implementing interface via aspect (only one implementer)">
<compile
files="pack/DefineInterface.java,
pack/InterfaceDefinition.java,
pack/MyInterface.java"/>
<run class="pack.InterfaceDefinition"/>
<compile
includeClassesDir="true"
files="Main1.java"/>
<run class="Main1"/>
</ajc-test>

</suite> </suite>

+ 0
- 34
tests/ajcTestsFailing.xml Ver arquivo

</compile> </compile>
<run class="org.aspectj.langlib.PointcutsCW"/> <run class="org.aspectj.langlib.PointcutsCW"/>
</ajc-test> </ajc-test>

<ajc-test dir="bugs/interfaceDefinition"
pr="43972"
title="Use class implementing interface via aspect">
<compile
files="pack/DefineInterface.java,
pack/InterfaceDefinition.java,
pack/MyInterface.java"/>
<run class="pack.InterfaceDefinition"/>
<compile
includeClassesDir="true"
files="Main.java"/>
<run class="Main"/>
</ajc-test>
<ajc-test dir="new" <ajc-test dir="new"
pr="42668" pr="42668"
<run class="SubtypeConstructorCW"/> <run class="SubtypeConstructorCW"/>
</ajc-test> </ajc-test>


<ajc-test dir="bugs/interAbstract"
pr="49784"
title="aspect declares interface method (no modifiers)">
<compile files="InterfaceMethodDeclarationNone.java" />
<run class="InterfaceMethodDeclarationNone"/>
</ajc-test>

<ajc-test dir="bugs/interAbstract"
pr="49784"
title="aspect declares interface method (abstract)">
<compile files="InterfaceMethodDeclarationAbstract.java" />
<run class="InterfaceMethodDeclarationAbstract"/>
</ajc-test>


<ajc-test dir="bugs/interAbstract"
pr="49784"
comment="working in 1.1.1 - keep with others?"
title="aspect declares interface method (public abstract)">
<compile files="InterfaceMethodDeclarationFull.java" />
<run class="InterfaceMethodDeclarationFull"/>
</ajc-test>




</suite> </suite>

+ 7
- 0
tests/bugs/abstractMethods/abstractClass/B.java Ver arquivo

abstract class B {}
aspect A {
abstract void B.m();

public static void doit(B b) { b.m(); }
}

+ 6
- 0
tests/bugs/abstractMethods/abstractClass/C.java Ver arquivo

public class C extends B {
public static void main(String[] args) {
A.doit(new C());
}
}

BIN
tests/bugs/abstractMethods/abstractClass/jars/AandB.jar Ver arquivo


+ 5
- 0
tests/bugs/abstractMethods/interface/A.java Ver arquivo

aspect A {
void B.m(){}

public static void doit(B b) { b.m(); }
}

+ 1
- 0
tests/bugs/abstractMethods/interface/B.java Ver arquivo

interface B {}

+ 5
- 0
tests/bugs/abstractMethods/interface/C.java Ver arquivo

public class C implements B {
public static void main(String[] args) {
A.doit(new C());
}
}

BIN
tests/bugs/abstractMethods/interface/jars/AandB.jar Ver arquivo


+ 14
- 0
tests/bugs/abstractMethods/singlesource/C.java Ver arquivo

abstract class B {}
aspect A {
abstract void B.m();

public static void doit(B b) { b.m(); }
}

public class C extends B {
public static void main(String[] args) {
A.doit(new C());
}
}


+ 17
- 0
tests/bugs/abstractMethods/singlesource/C1.java Ver arquivo

abstract class B {}
aspect A {
abstract void B.m();

public static void doit(B b) { b.m(); }
}

public class C1 extends B {
public static void main(String[] args) {
A.doit(new C1());
}
}

aspect A1 {
void C1.m() {}
}

+ 16
- 0
tests/bugs/abstractMethods/singlesource/C2.java Ver arquivo

abstract class B {}
aspect A {
public abstract void B.m();

public static void doit(B b) { b.m(); }
}

public class C2 extends B {
public static void main(String[] args) {
A.doit(new C2());
}
public void m() {}
}


+ 8
- 0
tests/bugs/interfaceDefinition/Main1.java Ver arquivo


/** @testcase PR#43972 Use class implementing interface via aspect */
public class Main1 {
public static void main(String[] args) {
pack.MyInterface i = new pack.InterfaceDefinition.C();
i.m();
}
}

+ 0
- 1
tests/bugs/interfaceDefinition/pack/DefineInterface.java Ver arquivo

declare parents: InterfaceDefinition.C implements MyInterface; declare parents: InterfaceDefinition.C implements MyInterface;
static { static {
Tester.expectEvent("m()"); Tester.expectEvent("m()");
Tester.expectEvent("p()");
} }
public void MyInterface.m() { public void MyInterface.m() {
Tester.event("m()"); Tester.event("m()");

Carregando…
Cancelar
Salvar