/** * Creates a dummy output directory without compiling the module. Either this method or {@link * #precompile} should be called first. */ synchronized Job.Result initWithoutPrecompile(TreeLogger logger) throws UnableToCompleteException { long startTime = System.currentTimeMillis(); CompileDir compileDir = outboxDir.makeCompileDir(logger); TreeLogger compileLogger = makeCompileLogger(compileDir, logger); ModuleDef module; try { module = loadModule(compileLogger); logger.log(TreeLogger.INFO, "Loading Java files in " + inputModuleName + "."); CompilerOptions loadOptions = new CompilerOptionsImpl(compileDir, inputModuleName, options); compilerContext = compilerContextBuilder.options(loadOptions).unitCache(unitCache).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); 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); } long elapsedTime = System.currentTimeMillis() - startTime; compileLogger.log(TreeLogger.Type.INFO, "Module setup completed in " + elapsedTime + " ms"); return new Result(compileDir, module.getName(), null); }
private boolean doCompile(TreeLogger compileLogger, CompileDir compileDir, Job job) throws UnableToCompleteException { job.onProgress("Loading modules"); CompilerOptions loadOptions = new CompilerOptionsImpl(compileDir, inputModuleName, options); compilerContext = compilerContextBuilder.options(loadOptions).build(); ModuleDef module = loadModule(compileLogger); if (!Compiler.maybeRestrictProperties(compileLogger, module, loadOptions.getProperties())) { return false; } // We need to generate the stub before restricting permutations String recompileJs = generateModuleRecompileJs(module, compileLogger); Map<String, String> bindingProperties = restrictPermutations(compileLogger, module, job.getBindingProperties()); // Propagates module rename. String newModuleName = module.getName(); outputModuleName.set(newModuleName); // Check if we can skip the compile altogether. InputSummary input = new InputSummary(bindingProperties, module); if (input.equals(lastBuildInput)) { compileLogger.log(Type.INFO, "skipped compile because no input files have changed"); 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? CompilerOptions runOptions = new CompilerOptionsImpl(compileDir, newModuleName, options); compilerContext = compilerContextBuilder.options(runOptions).build(); MinimalRebuildCache minimalRebuildCache = new NullRebuildCache(); if (options.isIncrementalCompileEnabled()) { // Returns a copy of the intended cache, which is safe to modify in this compile. minimalRebuildCache = minimalRebuildCacheManager.getCache(inputModuleName, bindingProperties); } job.setCompileStrategy( minimalRebuildCache.isPopulated() ? CompileStrategy.INCREMENTAL : CompileStrategy.FULL); boolean success = new Compiler(runOptions, minimalRebuildCache).run(compileLogger, module); if (success) { publishedCompileDir = compileDir; lastBuildInput = input; if (options.isIncrementalCompileEnabled()) { minimalRebuildCacheManager.putCache( inputModuleName, bindingProperties, minimalRebuildCache); } String moduleName = outputModuleName.get(); writeRecompileNoCacheJs( new File(publishedCompileDir.getWarDir(), moduleName), moduleName, recompileJs, compileLogger); if (launcherDir != null) { launcherDir.update(module, compileDir, compileLogger); } } return success; }