Opts compilePerFile into noPrecompile to avoid >1 permutation.

Compile per file mode requires that compiles be limited to just 1
permutation but it was possible for the *first* SDM compile to have a
set of binding properties that was not completely restricted. Since
compiles triggered from the browser always have exactly 1 permutation,
opting into noPrecompile avoids the 2 permutation failure mode.

Also went ahead and made noPrecompile do a compilation unit cache
warming since this will make the first compile faster and users might
not notice the noPrecompile warm time.

Change-Id: I5608de3a624c9089ab34cd9bd79adfd0ae0beb0c
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
index 6c58d5f..bee2b4b 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
@@ -307,7 +307,7 @@
 
     @Override
     public String getPurposeSnippet() {
-      return "Compiles faster by creating a JavaScript file per class. "
+      return "Compiles faster by creating/reusing a JS file per class. "
           + "Can't be used with -Xincremental.";
     }
 
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Outbox.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Outbox.java
index f2275f2..62f7d19 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Outbox.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Outbox.java
@@ -70,7 +70,7 @@
    */
   void maybePrecompile(TreeLogger logger) throws UnableToCompleteException {
 
-    if (options.getNoPrecompile()) {
+    if (options.getNoPrecompile() || options.shouldCompilePerFile()) {
       publish(recompiler.initWithoutPrecompile(logger), null);
       return;
     }
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 9a27ed6..9eb5948 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
@@ -188,6 +188,13 @@
     TreeLogger compileLogger = makeCompileLogger(compileDir, logger);
 
     ModuleDef module = loadModule(compileLogger);
+
+    logger.log(TreeLogger.INFO, "Prebuilding/loading the compilation unit cache.");
+    CompilerOptions loadOptions = new CompilerOptionsImpl(compileDir, inputModuleName, options);
+    compilerContext = compilerContextBuilder.options(loadOptions).unitCache(
+        Compiler.getOrCreateUnitCache(logger, loadOptions)).build();
+    module.getCompilationState(compileLogger, compilerContext);
+
     String newModuleName = module.getName();  // includes any rename.
     outputModuleName.set(newModuleName);
 
diff --git a/dev/core/src/com/google/gwt/dev/Compiler.java b/dev/core/src/com/google/gwt/dev/Compiler.java
index f913e57..440e952 100644
--- a/dev/core/src/com/google/gwt/dev/Compiler.java
+++ b/dev/core/src/com/google/gwt/dev/Compiler.java
@@ -21,6 +21,7 @@
 import com.google.gwt.dev.CompileTaskRunner.CompileTask;
 import com.google.gwt.dev.cfg.ModuleDef;
 import com.google.gwt.dev.cfg.ModuleDefLoader;
+import com.google.gwt.dev.javac.UnitCache;
 import com.google.gwt.dev.javac.UnitCacheSingleton;
 import com.google.gwt.dev.jjs.JsOutputOption;
 import com.google.gwt.dev.jjs.PermutationResult;
@@ -76,6 +77,17 @@
     }
   }
 
+  /**
+   * Locates the unit cache dir relative to the war dir and returns a UnitCache instance.
+   */
+  public static UnitCache getOrCreateUnitCache(TreeLogger logger, CompilerOptions options) {
+    File persistentUnitCacheDir = null;
+    if (options.getWarDir() != null && !options.getWarDir().getName().endsWith(".jar")) {
+      persistentUnitCacheDir = new File(options.getWarDir(), "../");
+    }
+    return UnitCacheSingleton.get(logger, persistentUnitCacheDir);
+  }
+
   public static void main(String[] args) {
     Memory.initialize();
     if (System.getProperty("gwt.jjs.dumpAst") != null) {
@@ -116,9 +128,9 @@
     // Exit w/ non-success code.
     System.exit(1);
   }
-
-  private final CompilerContext.Builder compilerContextBuilder;
   private CompilerContext compilerContext;
+  private final CompilerContext.Builder compilerContextBuilder;
+
   private final CompilerOptionsImpl options;
 
   public Compiler(CompilerOptions compilerOptions) {
@@ -170,12 +182,8 @@
         options.setNamespace(JsNamespaceOption.NONE);
       }
 
-      File persistentUnitCacheDir = null;
-      if (options.getWarDir() != null && !options.getWarDir().getName().endsWith(".jar")) {
-        persistentUnitCacheDir = new File(options.getWarDir(), "../");
-      }
-      compilerContext = compilerContextBuilder.unitCache(
-          UnitCacheSingleton.get(logger, persistentUnitCacheDir)).build();
+      compilerContext =
+          compilerContextBuilder.unitCache(getOrCreateUnitCache(logger, options)).build();
 
       for (ModuleDef module : modules) {
         compilerContext = compilerContextBuilder.module(module).build();