Super Dev Mode: fix error log for invalid .gwt.xml files

Makes sure that lastBuild is always set regardless of the
exception, so the error log will show up.

Bug: issue 8966
Change-Id: Ibf767a09be919759a9fbaebe71d5d0a663e9cf89
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
index 49f3510..b109908 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
@@ -158,13 +158,16 @@
     int compileId = ++compilesDone;
     CompileDir compileDir = outboxDir.makeCompileDir(job.getLogger());
     TreeLogger compileLogger = makeCompileLogger(compileDir, job.getLogger());
-
-    job.onStarted(compileId, compileDir);
-
-    boolean success = doCompile(compileLogger, compileDir, job);
-    if (!success) {
-      compileLogger.log(TreeLogger.Type.ERROR, "Compiler returned false");
-      throw new UnableToCompleteException();
+    try {
+      job.onStarted(compileId, compileDir);
+      boolean success = doCompile(compileLogger, compileDir, job);
+      if (!success) {
+        compileLogger.log(TreeLogger.Type.ERROR, "Compiler returned false");
+        throw new UnableToCompleteException();
+      }
+    } finally {
+      // Make the error log available no matter what happens
+      lastBuild.set(compileDir);
     }
 
     long elapsedTime = System.currentTimeMillis() - startTime;
@@ -184,27 +187,31 @@
     long startTime = System.currentTimeMillis();
     CompileDir compileDir = outboxDir.makeCompileDir(logger);
     TreeLogger compileLogger = makeCompileLogger(compileDir, logger);
+    ModuleDef module;
+    try {
+      module = loadModule(Sets.<String>newHashSet(), compileLogger);
 
-    ModuleDef module = loadModule(Sets.<String>newHashSet(), compileLogger);
+      logger.log(TreeLogger.INFO, "Loading Java files in " + inputModuleName + ".");
+      CompilerOptions loadOptions = new CompilerOptionsImpl(compileDir, inputModuleName, options);
+      compilerContext = compilerContextBuilder.options(loadOptions).unitCache(
+          Compiler.getOrCreateUnitCache(logger, loadOptions)).build();
 
-    logger.log(TreeLogger.INFO, "Loading Java files in " + inputModuleName + ".");
-    CompilerOptions loadOptions = new CompilerOptionsImpl(compileDir, inputModuleName, options);
-    compilerContext = compilerContextBuilder.options(loadOptions).unitCache(
-        Compiler.getOrCreateUnitCache(logger, loadOptions)).build();
+      // Loads and parses all the Java files in the GWT application using the JDT.
+      // (This is warmup to make compiling faster later; we stop at this point to avoid
+      // needing to know the binding properties.)
+      module.getCompilationState(compileLogger, compilerContext);
 
-    // Loads and parses all the Java files in the GWT application using the JDT.
-    // (This is warmup to make compiling faster later; we stop at this point to avoid
-    // needing to know the binding properties.)
-    module.getCompilationState(compileLogger, compilerContext);
+      setUpCompileDir(compileDir, module, compileLogger);
+      if (launcherDir != null) {
+        launcherDir.update(module, compileDir, compileLogger);
+      }
 
-    setUpCompileDir(compileDir, module, compileLogger);
-    if (launcherDir != null) {
-      launcherDir.update(module, compileDir, compileLogger);
+      outputModuleName.set(module.getName());
+    } finally {
+      // Make the compile log available no matter what happens.
+      lastBuild.set(compileDir);
     }
 
-    outputModuleName.set(module.getName());
-    lastBuild.set(compileDir);
-
     long elapsedTime = System.currentTimeMillis() - startTime;
     compileLogger.log(TreeLogger.Type.INFO, "Module setup completed in " + elapsedTime + " ms");
 
@@ -303,7 +310,8 @@
       job.setCompileStrategy(CompileStrategy.SKIPPED);
       return true;
     }
-
+    // Force a recompile if we don't succeed.
+    lastBuildInput = null;
 
     job.onProgress("Compiling");
     // TODO: use speed tracer to get more compiler events?
@@ -332,11 +340,7 @@
       if (launcherDir != null) {
         launcherDir.update(module, compileDir, compileLogger);
       }
-    } else {
-      // always recompile after an error
-      lastBuildInput = null;
     }
-    lastBuild.set(compileDir); // makes compile log available over HTTP
 
     return success;
   }