Incremental compilation does not delete weaver-generated class filestags/Root_ajdt_support
@@ -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> |
@@ -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 { | |||
} |
@@ -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 { | |||
} |
@@ -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"); | |||
} | |||
} |
@@ -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; |