declare precedence on a class should be a compile-time errortags/Root_ajdt_support
@@ -7511,4 +7511,16 @@ | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs/declarePrecedenceWithClasses" pr="53012" | |||
title="declare precedence on a class should be a compile-time error"> | |||
<compile files="DeclarePrecedenceTestClass.java" > | |||
<message kind="error" line="10" text="Non-aspect types can only be specified"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs/declarePrecedenceWithClasses" pr="53012" | |||
title="declare precedence on a class should be a compile-time error"> | |||
<compile files="Priority.aj" /> | |||
</ajc-test> | |||
</suite> |
@@ -0,0 +1,15 @@ | |||
//Bug 53012 | |||
// DP contains a declare precedence statement that mentions classes | |||
public class DeclarePrecedenceTestClass { | |||
public static void main(String[] args) { | |||
System.out.println("hello"); | |||
} | |||
} | |||
aspect DP { | |||
declare precedence: DeclarePrecedenceTestClass, DP; | |||
before() : staticinitialization(DeclarePrecedenceTestClass) { | |||
System.out.println("ok"); | |||
} | |||
} |
@@ -0,0 +1,11 @@ | |||
// Bug 53012 | |||
// Although the declare precedence mentions interfaces (and not aspects explicitly), it does | |||
// mention with a '+' suffix - this should be allowed. | |||
public aspect Priority { | |||
public interface Highest {} | |||
public interface Lowest {} | |||
declare precedence: Highest+, *, Lowest+; | |||
} | |||
aspect Security implements Priority.Highest {} |
@@ -82,6 +82,14 @@ public class DeclarePrecedence extends Declare { | |||
} | |||
ResolvedTypeX exactType = pi.getExactType().resolve(scope.getWorld()); | |||
if (exactType == ResolvedTypeX.MISSING) continue; | |||
// Cannot do a dec prec specifying a non-aspect types unless suffixed with a '+' | |||
if (!exactType.isAspect() && !pi.isIncludeSubtypes()) { | |||
scope.getWorld().showMessage(IMessage.ERROR, | |||
"Non-aspect types can only be specified in a declare precedence statement when subtypes are included. Non-aspect type is : "+exactType.getName(), | |||
pi.getSourceLocation(),null); | |||
} | |||
for (int j=0; j < patterns.size(); j++) { | |||
if (j == i) continue; | |||
TypePattern pj = patterns.get(j); |