]> source.dussan.org Git - aspectj.git/commitdiff
fix for Bugzilla Bug 55134
authoracolyer <acolyer>
Thu, 18 Mar 2004 14:36:58 +0000 (14:36 +0000)
committeracolyer <acolyer>
Thu, 18 Mar 2004 14:36:58 +0000 (14:36 +0000)
  Incremental compilation does not delete weaver-generated class files

tests/ajcTests.xml
tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.delete.20.java [new file with mode: 0644]
tests/incremental/initialTests/classWAroundClosureRemoved/AdviceOnIntroduced.java [new file with mode: 0644]
tests/incremental/initialTests/classWAroundClosureRemoved/Main.java [new file with mode: 0644]
weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java

index 496db30abf82d84b2a01f1c32beb7722af615b6a..f0da796c3b3212d28109d0e37a821fce14d86a25 100644 (file)
         <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 (file)
index 0000000..4da93f0
--- /dev/null
@@ -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 (file)
index 0000000..4da93f0
--- /dev/null
@@ -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 (file)
index 0000000..7c85f90
--- /dev/null
@@ -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
index ab446340719e1ea6b167f3eb94340459bcea8ec7..e67f175295877890c34d14b324f3d000dd82919c 100644 (file)
@@ -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;