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();