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