// If runtime version check fails, warn or fail? (unset?)
static final boolean FAIL_IF_RUNTIME_NOT_FOUND = false;
+ // support for producing .class files containing errors and maintaining 'state' even when the
+ // project is broken (meaning all builds after the first are incremental)
+ public static boolean continueWhenErrors = true;
+
private static final FileFilter binarySourceFilter =
new FileFilter() {
public boolean accept(File f) {
throws IOException, AbortException {
return doBuild(buildConfig, baseHandler, false);
}
-
/** @throws AbortException if check for runtime fails */
protected boolean doBuild(
binarySourcesForTheNextCompile = state.getBinaryFilesToCompile(true);
performCompilation(buildConfig.getFiles());
state.clearBinarySourceFiles(); // we don't want these hanging around...
- if (handler.hasErrors()) {
+ if (!continueWhenErrors && handler.hasErrors()) {
CompilationAndWeavingContext.leavingPhase(ct);
- if (AsmManager.isReporting())
- AsmManager.getDefault().reportModelInfo("After a failed batch build");
+ if (AsmManager.isReporting())
+ AsmManager.getDefault().reportModelInfo("After a batch build");
return false;
}
// System.err.println("XXXX inc: " + files);
performCompilation(files);
- if (handler.hasErrors() || (progressListener!=null && progressListener.isCancelledRequested())) {
+ if ((!continueWhenErrors && handler.hasErrors()) || (progressListener!=null && progressListener.isCancelledRequested())) {
CompilationAndWeavingContext.leavingPhase(ct);
return false;
}
public void acceptResult(CompilationResult unitResult) {
// end of compile, must now write the results to the output destination
// this is either a jar file or a file in a directory
- if (!(unitResult.hasErrors() && !proceedOnError())) {
+ if (!((unitResult.hasErrors() && !continueWhenErrors) && !proceedOnError())) {
Collection classFiles = unitResult.compiledTypes.values();
boolean shouldAddAspectName = (buildConfig.getOutxmlName() != null);
for (Iterator iter = classFiles.iterator(); iter.hasNext();) {
import java.io.IOException;
import java.util.Date;
+import org.aspectj.ajdt.internal.core.builder.AjBuildManager;
+
public class ProceedOnErrorTestCase extends CommandTestCase {
* C2.java.
*/
public void testNoProceedOnError() throws IOException {
- checkCompile("src1/C1.java", NO_ERRORS);
- File f =new File(getSandboxName(),"C.class");
- long oldmodtime = f.lastModified();
- pause(2);
- checkCompile("src1/C2.java", new int[]{1});
- f =new File(getSandboxName(),"C.class");
- long newmodtime = f.lastModified();
- // Without -proceedOnError supplied, we should *not* change the time stamp on the .class file
- assertTrue("The .class file should not have been modified as '-proceedOnError' was not supplied (old="+
- new Date(oldmodtime).toString()+")(new="+new Date(newmodtime).toString()+")",
- oldmodtime==newmodtime);
+ try {
+ AjBuildManager.continueWhenErrors=false;
+ checkCompile("src1/C1.java", NO_ERRORS);
+ File f =new File(getSandboxName(),"C.class");
+ long oldmodtime = f.lastModified();
+ pause(2);
+ checkCompile("src1/C2.java", new int[]{1});
+ f =new File(getSandboxName(),"C.class");
+ long newmodtime = f.lastModified();
+ // Without -proceedOnError supplied, we should *not* change the time stamp on the .class file
+ assertTrue("The .class file should not have been modified as '-proceedOnError' was not supplied (old="+
+ new Date(oldmodtime).toString()+")(new="+new Date(newmodtime).toString()+")",
+ oldmodtime==newmodtime);
+ } finally {
+ AjBuildManager.continueWhenErrors=true;
+ }
}
public void testProceedOnError() throws IOException {