summaryrefslogtreecommitdiffstats
path: root/tests/new/TargetObjectReplacement.java
diff options
context:
space:
mode:
authorwisberg <wisberg>2002-12-16 18:51:06 +0000
committerwisberg <wisberg>2002-12-16 18:51:06 +0000
commit144143c2970a1e874d74cdbd0f8c622d4282a3c3 (patch)
treeb12383d3d9e76c7e1f25f7fbec83051ef17f81fb /tests/new/TargetObjectReplacement.java
parentfafae443719b26159ab2d7dac1c9b46b5e00b671 (diff)
downloadaspectj-144143c2970a1e874d74cdbd0f8c622d4282a3c3.tar.gz
aspectj-144143c2970a1e874d74cdbd0f8c622d4282a3c3.zip
initial version
Diffstat (limited to 'tests/new/TargetObjectReplacement.java')
-rw-r--r--tests/new/TargetObjectReplacement.java64
1 files changed, 64 insertions, 0 deletions
diff --git a/tests/new/TargetObjectReplacement.java b/tests/new/TargetObjectReplacement.java
new file mode 100644
index 000000000..6c5e26ce9
--- /dev/null
+++ b/tests/new/TargetObjectReplacement.java
@@ -0,0 +1,64 @@
+import org.aspectj.testing.Tester;
+
+/** @testcase replacing this or target in around advice */
+public class TargetObjectReplacement {
+ public static void main(String[] args) {
+ Foo f = new Foo("orig");
+ // replacing target or this in advice does not affect caller reference
+ f.m();
+ f.n();
+ f.o();
+ f.p();
+ Tester.checkEqual(f.idhat, "orig"); // no affect presumed
+ Tester.checkAllEvents();
+ }
+ static {
+ Tester.expectEvent("m: m-delegate");
+ Tester.expectEvent("n: n-delegate");
+ Tester.expectEvent("o: o-delegate");
+ Tester.expectEvent("p: orig"); // no affect presumed
+ }
+}
+
+class Foo {
+ String id;
+ String idhat;
+
+ Foo(String id) {
+ this.id = id;
+ this.idhat = id;
+ }
+
+ void m() {
+ Tester.event("m: " + id);
+ }
+
+ void n() {
+ Tester.event("n: " + id);
+ }
+
+ void o() {
+ Tester.event("o: " + id);
+ }
+
+ void p() {
+ Tester.event("p: " + id); // before around advice on idhat get
+ Tester.checkEqual(idhat, "p-delegate"); // callees affected
+ }
+}
+
+aspect A {
+
+ void around(Foo foo): target(foo) && call(void m()) {
+ proceed(new Foo("m-delegate"));
+ }
+ void around(Foo foo): target(foo) && execution(void n()) {
+ proceed(new Foo("n-delegate"));
+ }
+ void around(Foo foo): this(foo) && execution(void o()) {
+ proceed(new Foo("o-delegate"));
+ }
+ String around(Foo foo): target(foo) && get(String Foo.idhat) && within(Foo) {
+ return proceed(new Foo("p-delegate"));
+ }
+}