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
import java.util.*; | import java.util.*; | ||||
import org.aspectj.lang.annotation.*; | import org.aspectj.lang.annotation.*; | ||||
@Aspect | @Aspect | ||||
class Iffy2 { | class Iffy2 { | ||||
// Match getCollectionArray(), getIntegerCollectionArray() | |||||
@Before("execution(!void *(..))") | @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[] *(..))") | @Before("execution(*..Collection[] *(..))") | ||||
public void advice4() {} | |||||
public void wildcardRawCollectionArray() { } | |||||
// Match getCollectionArray() | |||||
@Before("execution(java.util.Collection<?>[] *(..))") | @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() { | public Collection<?>[] getCollectionArray() { | ||||
return null; | |||||
return null; | |||||
} | } | ||||
public Collection<Integer>[] getIntegerCollectionArray() { | |||||
return null; | |||||
} | |||||
} | } |
<ajc-test dir="bugs165/pr272233" title="funky pointcut 2"> | <ajc-test dir="bugs165/pr272233" title="funky pointcut 2"> | ||||
<compile files="Iffy2.java" options="-1.5 -showWeaveInfo"> | <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="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> | </compile> | ||||
</ajc-test> | </ajc-test> | ||||