summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2004-12-09 16:15:38 +0000
committeraclement <aclement>2004-12-09 16:15:38 +0000
commiteb673019179c372c6c17dd403e53d96feae434fd (patch)
tree844711e35a57220f405e2e8a95130519ad7e21be
parent88fca98be4be9cfd15a25145ec96548f120dd8ab (diff)
downloadaspectj-eb673019179c372c6c17dd403e53d96feae434fd.tar.gz
aspectj-eb673019179c372c6c17dd403e53d96feae434fd.zip
Complete varargs support.
-rw-r--r--tests/java5/varargs/SimpleVarargs.java1
-rw-r--r--tests/java5/varargs/VarargsAspect05.aj5
-rw-r--r--tests/java5/varargs/VarargsAspect06.aj5
-rw-r--r--tests/java5/varargs/testcode.jarbin618 -> 618 bytes
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/AllTestsJava5_binaryWeaving.java4
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/AnnotationPointcutsTests.java (renamed from tests/src/org/aspectj/systemtest/ajc150/AnnotationPointcuts.java)22
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/VarargsTests.java (renamed from tests/src/org/aspectj/systemtest/ajc150/Varargs.java)38
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java2
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/PatternParser.java8
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java7
10 files changed, 67 insertions, 25 deletions
diff --git a/tests/java5/varargs/SimpleVarargs.java b/tests/java5/varargs/SimpleVarargs.java
index 4060443ee..bcd1e1bdf 100644
--- a/tests/java5/varargs/SimpleVarargs.java
+++ b/tests/java5/varargs/SimpleVarargs.java
@@ -21,5 +21,6 @@ public class SimpleVarargs {
s.fooInt(2,new Integer(45),new Integer(45));
s.fooInt(3,new Integer[]{new Integer(45),new Integer(45)});
// s.barInt(4,new Integer[]{new Integer(45),new Integer(45)});
+
}
}
diff --git a/tests/java5/varargs/VarargsAspect05.aj b/tests/java5/varargs/VarargsAspect05.aj
new file mode 100644
index 000000000..d170e3b1e
--- /dev/null
+++ b/tests/java5/varargs/VarargsAspect05.aj
@@ -0,0 +1,5 @@
+public aspect VarargsAspect05 {
+
+ before(): call(* *(Integer...)) { }
+
+}
diff --git a/tests/java5/varargs/VarargsAspect06.aj b/tests/java5/varargs/VarargsAspect06.aj
new file mode 100644
index 000000000..3ea869aa2
--- /dev/null
+++ b/tests/java5/varargs/VarargsAspect06.aj
@@ -0,0 +1,5 @@
+public aspect VarargsAspect06 {
+
+ before(): call(* *(int,Integer...)) { }
+
+}
diff --git a/tests/java5/varargs/testcode.jar b/tests/java5/varargs/testcode.jar
index 86331bbeb..f4ea2d124 100644
--- a/tests/java5/varargs/testcode.jar
+++ b/tests/java5/varargs/testcode.jar
Binary files differ
diff --git a/tests/src/org/aspectj/systemtest/ajc150/AllTestsJava5_binaryWeaving.java b/tests/src/org/aspectj/systemtest/ajc150/AllTestsJava5_binaryWeaving.java
index f03ceef4f..f2df9add9 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/AllTestsJava5_binaryWeaving.java
+++ b/tests/src/org/aspectj/systemtest/ajc150/AllTestsJava5_binaryWeaving.java
@@ -29,8 +29,8 @@ public class AllTestsJava5_binaryWeaving {
suite.addTestSuite(CovarianceTests.class);
suite.addTestSuite(Enums.class);
suite.addTestSuite(Annotations.class);
- suite.addTestSuite(AnnotationPointcuts.class);
- suite.addTestSuite(Varargs.class);
+ suite.addTestSuite(AnnotationPointcutsTests.class);
+ suite.addTestSuite(VarargsTests.class);
//$JUnit-END$
return suite;
}
diff --git a/tests/src/org/aspectj/systemtest/ajc150/AnnotationPointcuts.java b/tests/src/org/aspectj/systemtest/ajc150/AnnotationPointcutsTests.java
index 1f87b10c5..517b300ae 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/AnnotationPointcuts.java
+++ b/tests/src/org/aspectj/systemtest/ajc150/AnnotationPointcutsTests.java
@@ -20,7 +20,7 @@ import org.aspectj.tools.ajc.CompilationResult;
/**
* Tests the use of Annotations in pointcuts
*/
-public class AnnotationPointcuts extends TestUtils {
+public class AnnotationPointcutsTests extends TestUtils {
protected void setUp() throws Exception {
super.setUp();
@@ -34,23 +34,9 @@ public class AnnotationPointcuts extends TestUtils {
System.err.println(cR.getErrorMessages());
System.err.println(cR.getInfoMessages());
verifyWeavingMessagesOutput(cR,new String[]{
-"weaveinfo Type 'AnnotatedType' (AnnotatedType.java:3) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:4)",
-"weaveinfo Type 'AnnotatedType' (AnnotatedType.java:3) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:2)",
-"weaveinfo Type 'AnnotatedType' (AnnotatedType.java:4) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:4)"});
-
-// assertTrue("Expected three message about ITDs not allowed on Annotations but got: #"+
-// cR.getErrorMessages().size()+": \n"+cR.getErrorMessages(),
-// cR.getErrorMessages().size()==3);
-// IMessage msg1_ctor = (IMessage)cR.getErrorMessages().get(0);
-// IMessage msg2_method = (IMessage)cR.getErrorMessages().get(1);
-// IMessage msg3_field = (IMessage)cR.getErrorMessages().get(2);
-// assertTrue("Expected message about ITDCs on annotations not allowed, but got: \n"+msg1_ctor,
-// msg1_ctor.toString().indexOf("can't make inter-type constructor declarations")!=-1);
-// assertTrue("Expected message about ITDMs on annotations not allowed, but got: \n"+msg2_method,
-// msg2_method.toString().indexOf("can't make inter-type method declarations")!=-1);
-// assertTrue("Expected message about ITDFs on annotations not allowed, but got: \n"+msg3_field,
-// msg3_field.toString().indexOf("can't make inter-type field declarations")!=-1);
-// verifyWeavingMessagesOutput(cR,new String[]{});
+ "weaveinfo Type 'AnnotatedType' (AnnotatedType.java:3) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:4)",
+ "weaveinfo Type 'AnnotatedType' (AnnotatedType.java:3) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:2)",
+ "weaveinfo Type 'AnnotatedType' (AnnotatedType.java:4) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:4)"});
}
public void test002_AtAnnotationMatching() {
diff --git a/tests/src/org/aspectj/systemtest/ajc150/Varargs.java b/tests/src/org/aspectj/systemtest/ajc150/VarargsTests.java
index 075790c9b..7845f6bd1 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/Varargs.java
+++ b/tests/src/org/aspectj/systemtest/ajc150/VarargsTests.java
@@ -22,7 +22,7 @@ import org.aspectj.tools.ajc.CompilationResult;
* 1. cannot match on a varargs method by using 'Object[]' in your signature,
* this affects call/execution/initialization/withincode
*/
-public class Varargs extends TestUtils {
+public class VarargsTests extends TestUtils {
protected void setUp() throws Exception {
super.setUp();
@@ -56,11 +56,43 @@ public class Varargs extends TestUtils {
}
// check when signature is from an withincode PCD
+ // In this test, it can be tricky to understand the results!! The reason being that the shadow
+ // isn't included in the error message (it really should be, but thats a bit hard to do cleanly)
public void test003_cantMatchVarargsWithObjectArray_withincodePCD() {
- CompilationResult cR = binaryWeave("testcode.jar","VarargsAspect04.aj",0,1,true);
- assertTrue("Did not get expected message about a varags mismatch, instead got: "+cR.getWarningMessages(),
+ CompilationResult cR = binaryWeave("testcode.jar","VarargsAspect04.aj",0,7,true);
+
+ // There are 7. Each piece of the pointcut is matched against all the shadows, so both
+ // the 'withincode' PCD and the 'call' PCD are matched against every join point.
+ assertTrue("Did not get expected message about a varargs mismatch, instead got: "+cR.getWarningMessages(),
((IMessage)cR.getWarningMessages().get(0)).toString().indexOf("varargs declared method")!=-1);
+
verifyWeavingMessagesOutput(cR,new String[]{});
}
+
+ // before(): call(* *(Integer...)) { }
+ public void test_usingVarargsInPointcuts1() {
+ CompilationResult cR = binaryWeave("testcode.jar","VarargsAspect05.aj",0,0,true);
+ System.err.println(cR.getStandardError());
+ System.err.println(cR.getErrorMessages());
+ System.err.println(cR.getInfoMessages());
+ verifyWeavingMessagesOutput(cR,new String[]{
+ "weaveinfo Type 'SimpleVarargs' (SimpleVarargs.java:15) advised by before advice from 'VarargsAspect05' (VarargsAspect05.aj:3)",
+ "weaveinfo Type 'SimpleVarargs' (SimpleVarargs.java:16) advised by before advice from 'VarargsAspect05' (VarargsAspect05.aj:3)",
+ "weaveinfo Type 'SimpleVarargs' (SimpleVarargs.java:17) advised by before advice from 'VarargsAspect05' (VarargsAspect05.aj:3)"});
+ }
+
+ // before(): call(* *(int,Integer...)) { } - slightly more complex pcut
+ public void test_usingVarargsInPointcuts2() {
+ CompilationResult cR = binaryWeave("testcode.jar","VarargsAspect06.aj",0,0,true);
+ System.err.println(cR.getStandardError());
+ System.err.println(cR.getErrorMessages());
+ System.err.println(cR.getInfoMessages());
+
+ verifyWeavingMessagesOutput(cR,new String[]{
+ "weaveinfo Type 'SimpleVarargs' (SimpleVarargs.java:20) advised by before advice from 'VarargsAspect06' (VarargsAspect06.aj:3)",
+ "weaveinfo Type 'SimpleVarargs' (SimpleVarargs.java:21) advised by before advice from 'VarargsAspect06' (VarargsAspect06.aj:3)",
+ "weaveinfo Type 'SimpleVarargs' (SimpleVarargs.java:22) advised by before advice from 'VarargsAspect06' (VarargsAspect06.aj:3)"});
+ }
+
} \ No newline at end of file
diff --git a/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java
index 6da79c779..945b76ba7 100644
--- a/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java
@@ -190,6 +190,8 @@ public class ExactTypePattern extends TypePattern {
}
buff.append(type.toString());
if (includeSubtypes) buff.append('+');
+ // Note, there will be a rogue [] in the pattern here in the case of varargs ...
+ if (isVarArgs) buff.append("...");
if (annotationPattern != AnnotationTypePattern.ANY) {
buff.append(')');
}
diff --git a/weaver/src/org/aspectj/weaver/patterns/PatternParser.java b/weaver/src/org/aspectj/weaver/patterns/PatternParser.java
index 684377120..1eab94f92 100644
--- a/weaver/src/org/aspectj/weaver/patterns/PatternParser.java
+++ b/weaver/src/org/aspectj/weaver/patterns/PatternParser.java
@@ -587,7 +587,13 @@ public class PatternParser {
//??? what about the source location of any's????
if (names.size() == 1 && ((NamePattern)names.get(0)).isAny() && dim == 0) return TypePattern.ANY;
- return new WildTypePattern(names, includeSubtypes, dim, endPos,isVarArgs);
+ // Notice we increase the dimensions if varargs is set. this is to allow type matching to
+ // succeed later: The actual signature at runtime of a method declared varargs is an array type of
+ // the original declared type (so Integer... becomes Integer[] in the bytecode). So, here for the
+ // pattern 'Integer...' we create a WildTypePattern 'Integer[]' with varargs set. If this matches
+ // during shadow matching, we confirm that the varargs flags match up before calling it a successful
+ // match.
+ return new WildTypePattern(names, includeSubtypes, dim+(isVarArgs?1:0), endPos,isVarArgs);
}
diff --git a/weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java b/weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java
index 31cf6545a..c34a3ee7f 100644
--- a/weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/SignaturePattern.java
@@ -190,10 +190,14 @@ public class SignaturePattern extends PatternNode {
// If we have matched on parameters, let's just check it isn't because the last parameter in the pattern
// is an array type and the method is declared with varargs
+ // XXX - Ideally the shadow would be included in the msg but we don't know it...
if (isNotMatchBecauseOfVarargsIssue(parameterTypes,sig.getModifiers())) {
world.getLint().cantMatchArrayTypeOnVarargs.signal(sig.toString(),getSourceLocation());
return false;
}
+
+ if (parameterTypes.size()>0 && (sig.isVarargsMethod()^parameterTypes.get(parameterTypes.size()-1).isVarArgs))
+ return false;
// Check the throws pattern
if (!throwsPattern.matches(sig.getExceptions(), world)) return false;
@@ -206,6 +210,7 @@ public class SignaturePattern extends PatternNode {
// If we have matched on parameters, let's just check it isn't because the last parameter in the pattern
// is an array type and the method is declared with varargs
+ // XXX - Ideally the shadow would be included in the msg but we don't know it...
if (isNotMatchBecauseOfVarargsIssue(parameterTypes,sig.getModifiers())) {
world.getLint().cantMatchArrayTypeOnVarargs.signal(sig.toString(),getSourceLocation());
return false;
@@ -557,7 +562,7 @@ public class SignaturePattern extends PatternNode {
*/
private boolean isNotMatchBecauseOfVarargsIssue(TypePatternList params,int modifiers) {
if (params.size()>0 && (modifiers & Constants.ACC_VARARGS)!=0 && // XXX Promote this to an isVarargs() on MethodSignature?
- params.get(params.size()-1).getExactType().isArray()) {
+ !params.get(params.size()-1).isVarArgs) {
return true;
}
return false;