summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/ajcTests.xml14
-rw-r--r--tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.delete.20.java26
-rw-r--r--tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.java26
-rw-r--r--tests/incremental/initialTests/classWAroundClosureRemoved/Main.java9
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java26
5 files changed, 96 insertions, 5 deletions
diff --git a/tests/ajcTests.xml b/tests/ajcTests.xml
index 496db30ab..f0da796c3 100644
--- a/tests/ajcTests.xml
+++ b/tests/ajcTests.xml
@@ -7489,4 +7489,18 @@
<compile files="WeaveLocal.java" aspectpath="notAJar.jar" outjar="notAJar.jar" >
</compile>
</ajc-test>
+
+
+ <ajc-test dir="incremental/initialTests/classWAroundClosureRemoved"
+ title="make sure additional classes generated during weave are deleted with src class file"
+ keywords="incremental-test">
+ <compile staging="true"
+ options="-incremental"
+ sourceroots="."/>
+ <inc-compile tag="20" >
+ <dir-changes removed="AdviceOnIntroduced$AjcClosure1"/>
+ </inc-compile>
+ </ajc-test>
+
+
</suite>
diff --git a/tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.delete.20.java b/tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.delete.20.java
new file mode 100644
index 000000000..4da93f0ca
--- /dev/null
+++ b/tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.delete.20.java
@@ -0,0 +1,26 @@
+import org.aspectj.testing.Tester;
+
+public aspect AdviceOnIntroduced {
+ public static void main(String[] args) { test(); }
+
+ public static void test() {
+ Tester.checkEqual(new Foo(10).foo(5), 6, "foo");
+ }
+
+ int Foo.foo(int n) { return n; }
+ Foo.new(int w) {}
+
+ int around(int n):
+ within(AdviceOnIntroduced) &&
+ (args(n) && execution(int foo(int))) {
+ int result = proceed(n);
+ return result+1;
+ }
+
+ before(): within(Foo) && execution(new(..)) {
+ //System.out.println("before new");
+ }
+}
+
+class Foo {
+}
diff --git a/tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.java b/tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.java
new file mode 100644
index 000000000..4da93f0ca
--- /dev/null
+++ b/tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.java
@@ -0,0 +1,26 @@
+import org.aspectj.testing.Tester;
+
+public aspect AdviceOnIntroduced {
+ public static void main(String[] args) { test(); }
+
+ public static void test() {
+ Tester.checkEqual(new Foo(10).foo(5), 6, "foo");
+ }
+
+ int Foo.foo(int n) { return n; }
+ Foo.new(int w) {}
+
+ int around(int n):
+ within(AdviceOnIntroduced) &&
+ (args(n) && execution(int foo(int))) {
+ int result = proceed(n);
+ return result+1;
+ }
+
+ before(): within(Foo) && execution(new(..)) {
+ //System.out.println("before new");
+ }
+}
+
+class Foo {
+}
diff --git a/tests/incremental/initialTests/classWAroundClosureRemoved/Main.java b/tests/incremental/initialTests/classWAroundClosureRemoved/Main.java
new file mode 100644
index 000000000..7c85f90c2
--- /dev/null
+++ b/tests/incremental/initialTests/classWAroundClosureRemoved/Main.java
@@ -0,0 +1,9 @@
+import org.aspectj.testing.Tester;
+
+public class Main {
+
+ public static void main(String[] args) {
+ Tester.checkFailed("Incremental compilation did not appear to (re)weave Main");
+ }
+
+} \ No newline at end of file
diff --git a/weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java b/weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java
index ab4463407..e67f17529 100644
--- a/weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java
+++ b/weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java
@@ -15,6 +15,7 @@ package org.aspectj.weaver.bcel;
import java.io.BufferedOutputStream;
import java.io.File;
+import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
@@ -150,14 +151,29 @@ public class UnwovenClassFile {
public String toString() {
return "UnwovenClassFile(" + filename + ", " + getClassName() + ")";
}
-
+
+ /**
+ * delete not just this file, but any files in the same directory that
+ * were generated as a result of weaving it (e.g. for an around closure).
+ */
public void deleteRealFile() throws IOException {
- new File(filename).delete();
+ File victim = new File(filename);
+ String namePrefix = victim.getName();
+ namePrefix = namePrefix.substring(0,namePrefix.lastIndexOf('.'));
+ final String targetPrefix = namePrefix + "$Ajc";
+ File dir = victim.getParentFile();
+ if (dir != null) {
+ File[] weaverGenerated = dir.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return name.startsWith(targetPrefix);
+ }});
+ for (int i = 0; i < weaverGenerated.length; i++) {
+ weaverGenerated[i].delete();
+ }
+ }
+ victim.delete();
}
-
-
-
// record
public static class ChildClass {
public final String name;