Add more funky pointcuts concerning 'void[]' and pointcuts matching arrays of generic types. Remove TODO after previously committed bugfix. Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>pull/212/head
@@ -1,50 +1,60 @@ | |||
import java.util.*; | |||
import org.aspectj.lang.annotation.*; | |||
@Aspect | |||
class Iffy2 { | |||
// Match getCollectionArray(), getIntegerCollectionArray() | |||
@Before("execution(!void *(..))") | |||
public void advice1() {} | |||
public void nonVoid() { } | |||
@Before("execution(!void[] *(..))") | |||
public void advice2() {} | |||
// Do not match anything, because void[] is an illegal type | |||
@Before("execution(void[] *(..))") | |||
public void voidArray() { | |||
// This does not compile in Java | |||
// void[] voids = new void[5]; | |||
} | |||
@Before("execution(!void *(..))") | |||
public void advice3() {} | |||
// Match getCollectionArray() and myVoid(), getIntegerCollectionArray(), because void[] is an illegal type which | |||
// cannot be resolved/matched. The negation of an unmatched type, however, matches any type, similar to how | |||
// !my.UnknownType would also match all other types. | |||
@Before("execution(!void[][] *(..))") | |||
public void nonVoidArray() { } | |||
// Match getCollectionArray(), getIntegerCollectionArray() | |||
@Before("execution(*..Collection[] *(..))") | |||
public void advice4() {} | |||
public void wildcardRawCollectionArray() { } | |||
// Match getCollectionArray() | |||
@Before("execution(java.util.Collection<?>[] *(..))") | |||
public void advice5() {} | |||
/** | |||
* TODO: This pointcut is not parsed correctly. Obviously, the combination of | |||
* '*' and '<?>' leads to an AJ core dump with this error message: | |||
* <p> | |||
* <code> | |||
* org.aspectj.weaver.BCException: malformed org.aspectj.weaver.PointcutDeclaration attribute (length:219) | |||
* org.aspectj.weaver.BCException: Bad type signature * | |||
* at org.aspectj.weaver.AjAttribute.read(AjAttribute.java:137) | |||
* at org.aspectj.weaver.bcel.Utility.readAjAttributes(Utility.java:102) | |||
* at org.aspectj.weaver.bcel.BcelMethod.unpackAjAttributes(BcelMethod.java:197) | |||
* at org.aspectj.weaver.bcel.BcelMethod.<init>(BcelMethod.java:91) | |||
* at org.aspectj.weaver.bcel.BcelObjectType.getDeclaredMethods(BcelObjectType.java:290) | |||
* at org.aspectj.weaver.ReferenceType.getDeclaredMethods(ReferenceType.java:870) | |||
* at org.aspectj.weaver.ResolvedType.getDeclaredAdvice(ResolvedType.java:1028) | |||
* at org.aspectj.weaver.ResolvedType.getDeclaredShadowMungers(ResolvedType.java:1068) | |||
* at org.aspectj.weaver.ResolvedType.collectShadowMungers(ResolvedType.java:868) | |||
* at org.aspectj.weaver.ResolvedType.collectCrosscuttingMembers(ResolvedType.java:794) | |||
* at org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect(CrosscuttingMembersSet.java:112) | |||
* at org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect(CrosscuttingMembersSet.java:67) | |||
* at org.aspectj.weaver.bcel.BcelWeaver.prepareForWeave(BcelWeaver.java:512) | |||
* </code> | |||
*/ | |||
//@Before("execution(*..Collection<?>[] *(..))") | |||
public void advice6() {} | |||
public void exactGenericCollectionArray() { } | |||
// Match getCollectionArray() | |||
@Before("execution(*..Collection<?>[] *(..))") | |||
public void wildcardGenericCollectionArray() { } | |||
// Do not match anything | |||
@Before("execution(*..Collection<String>[] *(..))") | |||
public void wildcardGenericCollectionArrayOfString() { } | |||
// Match getIntegerCollectionArray() | |||
@Before("execution(*..Collection<Integer>[] *(..))") | |||
public void wildcardGenericCollectionArrayOfInteger() { } | |||
// Do not match anything. The fact that primitive type int is illegal as a generic type parameter, is not mentioned | |||
// in any warning. | |||
@Before("execution(*..Collection<int>[] *(..))") | |||
public void wildcardGenericCollectionArrayOfPrimitiveInt() { } | |||
public void myVoid() { } | |||
public Collection<?>[] getCollectionArray() { | |||
return null; | |||
return null; | |||
} | |||
public Collection<Integer>[] getIntegerCollectionArray() { | |||
return null; | |||
} | |||
} |
@@ -78,14 +78,26 @@ | |||
<ajc-test dir="bugs165/pr272233" title="funky pointcut 2"> | |||
<compile files="Iffy2.java" options="-1.5 -showWeaveInfo"> | |||
<!-- Should occur twice, but messages are identical, so they cannot be counted --> | |||
<message kind="warning" text="arrays cannot have a void type, but found 'void[]' in pointcut [Xlint:arrayCannotBeVoid]"/> | |||
<message kind="warning" text="arrays cannot have a void type, but found 'void[]' in pointcut [Xlint:arrayCannotBeVoid]"/> | |||
<message kind="weave" text="advised by before advice from 'Iffy2' (Iffy2.java:8)"/> | |||
<message kind="weave" text="advised by before advice from 'Iffy2' (Iffy2.java:11)"/> | |||
<message kind="weave" text="advised by before advice from 'Iffy2' (Iffy2.java:14)"/> | |||
<message kind="weave" text="advised by before advice from 'Iffy2' (Iffy2.java:17)"/> | |||
<message kind="weave" text="advised by before advice from 'Iffy2' (Iffy2.java:20)"/> | |||
<!-- TODO: Activate 'Iffy2.advice6()' pointcut after pointcut parsing problem has been fixed. --> | |||
<!--<message kind="weave" text="advised by before advice from 'Iffy2' (Iffy2.java:XX)"/>--> | |||
<message kind="warning" text="advice defined in Iffy2 has not been applied [Xlint:adviceDidNotMatch]" line="14"/> | |||
<message kind="warning" text="advice defined in Iffy2 has not been applied [Xlint:adviceDidNotMatch]" line="39"/> | |||
<message kind="warning" text="advice defined in Iffy2 has not been applied [Xlint:adviceDidNotMatch]" line="48"/> | |||
<message kind="weave" text="method-execution(void Iffy2.myVoid())' in Type 'Iffy2' (Iffy2.java:50) advised by before advice from 'Iffy2' (Iffy2.java:23)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getCollectionArray())' in Type 'Iffy2' (Iffy2.java:52) advised by before advice from 'Iffy2' (Iffy2.java:35)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getCollectionArray())' in Type 'Iffy2' (Iffy2.java:52) advised by before advice from 'Iffy2' (Iffy2.java:31)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getCollectionArray())' in Type 'Iffy2' (Iffy2.java:52) advised by before advice from 'Iffy2' (Iffy2.java:27)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getCollectionArray())' in Type 'Iffy2' (Iffy2.java:52) advised by before advice from 'Iffy2' (Iffy2.java:23)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getCollectionArray())' in Type 'Iffy2' (Iffy2.java:52) advised by before advice from 'Iffy2' (Iffy2.java:10)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getIntegerCollectionArray())' in Type 'Iffy2' (Iffy2.java:56) advised by before advice from 'Iffy2' (Iffy2.java:43)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getIntegerCollectionArray())' in Type 'Iffy2' (Iffy2.java:56) advised by before advice from 'Iffy2' (Iffy2.java:27)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getIntegerCollectionArray())' in Type 'Iffy2' (Iffy2.java:56) advised by before advice from 'Iffy2' (Iffy2.java:23)"/> | |||
<message kind="weave" text="method-execution(java.util.Collection[] Iffy2.getIntegerCollectionArray())' in Type 'Iffy2' (Iffy2.java:56) advised by before advice from 'Iffy2' (Iffy2.java:10)"/> | |||
</compile> | |||
</ajc-test> | |||