@@ -68,8 +68,6 @@ public class AspectDeclaration extends MemberTypeDeclaration { | |||
return; | |||
} | |||
if (concreteName != null) concreteName.checkPointcutDeclarations(); | |||
super.resolve(); | |||
} | |||
@@ -176,12 +176,13 @@ public class AjLookupEnvironment extends LookupEnvironment { | |||
private void resolvePointcutDeclarations(ClassScope s) { | |||
TypeDeclaration dec = s.referenceContext; | |||
SourceTypeBinding sourceType = s.referenceContext.binding; | |||
boolean hasPointcuts = false; | |||
AbstractMethodDeclaration[] methods = dec.methods; | |||
boolean initializedMethods = false; | |||
if (methods != null) { | |||
for (int i=0; i < methods.length; i++) { | |||
if (methods[i] instanceof PointcutDeclaration) { | |||
hasPointcuts = true; | |||
if (!initializedMethods) { | |||
sourceType.methods(); //force initialization | |||
initializedMethods = true; | |||
@@ -190,7 +191,13 @@ public class AjLookupEnvironment extends LookupEnvironment { | |||
} | |||
} | |||
} | |||
if (hasPointcuts || dec instanceof AspectDeclaration) { | |||
ResolvedTypeX.Name name = (ResolvedTypeX.Name)factory.fromEclipse(sourceType); | |||
EclipseSourceType eclipseSourceType = (EclipseSourceType)name.getDelegate(); | |||
eclipseSourceType.checkPointcutDeclarations(); | |||
} | |||
ReferenceBinding[] memberTypes = sourceType.memberTypes; | |||
for (int i = 0, length = memberTypes.length; i < length; i++) { | |||
resolvePointcutDeclarations(((SourceTypeBinding) memberTypes[i]).scope); |
@@ -6802,4 +6802,24 @@ | |||
<compile files="concern/ContextUser.java,concern/BaseTarget.java,core/Base.java" /> | |||
</ajc-test> | |||
<ajc-test dir="bugs" pr="49457" | |||
title="No error on overloaded pointcuts in class"> | |||
<compile files="OverloadedPointcutsInClass.java"> | |||
<message kind="error" line="3" text="duplicate pointcut name: pc1"/> | |||
<message kind="error" line="4" text="duplicate pointcut name: pc1"/> | |||
<message kind="error" line="6" text="duplicate pointcut name: pc2"/> | |||
<message kind="error" line="7" text="duplicate pointcut name: pc2"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs" pr="49457" | |||
title="No error on overloaded pointcuts unless binding variables"> | |||
<compile files="OverloadedPointcutsInAspect.java"> | |||
<message kind="error" line="15" text="duplicate pointcut name: pc"/> | |||
<message kind="error" line="16" text="duplicate pointcut name: pc"/> | |||
<message kind="error" line="18" text="incompatible type"/> | |||
<message kind="error" line="20" text="incompatible type"/> | |||
</compile> | |||
</ajc-test> | |||
</suite> |
@@ -0,0 +1,23 @@ | |||
class OverloadedPointcutsInAspect { | |||
public static void main(String[] args) { | |||
new C().run(); | |||
} | |||
} | |||
class C { | |||
public void run() {} | |||
} | |||
aspect A { | |||
declare parents: C implements Runnable; | |||
declare parents: C implements SubRunnable; | |||
interface SubRunnable extends Runnable {} | |||
pointcut pc(Runnable r) : target(r) && call(void run()); | |||
pointcut pc(SubRunnable r) : target(r) && call(void run()); | |||
before(Runnable r) : pc(r) { log("pc(Runnable r)"); } | |||
before(SubRunnable r) : pc(r) { log("pc(SubRunnable r)"); } | |||
before() : pc(Runnable) { log("pc(Runnable)"); } | |||
before() : pc(SubRunnable) { log("pc(SubRunnable)"); } | |||
before() : pc(*) { log("pc(*)"); } | |||
void log(String s) { System.out.println(s); } | |||
} |
@@ -0,0 +1,9 @@ | |||
public class OverloadedPointcutsInClass { | |||
pointcut pc1(): call(* *(..)); | |||
pointcut pc1(): execution(* *(..)); | |||
pointcut pc2(String s): call(* *(..)) && target(s); | |||
pointcut pc2(StringBuffer sb): call(* *(..)) && target(sb); | |||
} |