private Compilation(List<SourceFile> externs, List<SourceFile> inputs, List<JSModule> modules) { this.externs = ImmutableList.copyOf(externs); this.inputs = inputs == null ? null : ImmutableList.copyOf(inputs); this.modules = modules == null ? null : ImmutableList.copyOf(modules); ImmutableMap.Builder<String, JSModule> nameToModuleBuilder; if (modules == null) { nameToModuleBuilder = null; } else { nameToModuleBuilder = ImmutableMap.builder(); for (JSModule module : modules) { nameToModuleBuilder.put(module.getName(), module); } } this.nameToModule = (nameToModuleBuilder == null) ? null : nameToModuleBuilder.build(); }
/** * Writes out all of the module files. This method is only applicable when modules are used. This * is expected to be used only with the build command. * * @throws IOException */ public void writeCompiledCodeToFiles( final Function<String, String> moduleNameToUri, String sourceMapPath) throws IOException { if (modules == null) { throw new IllegalStateException("This compilation does not use modules"); } ModuleConfig moduleConfig = config.getModuleConfig(); Map<String, File> moduleToOutputPath = moduleConfig.getModuleToOutputPath(); final Map<String, String> moduleNameToFingerprint = Maps.newHashMap(); final boolean isDebugMode = false; for (JSModule module : modules) { String moduleName = module.getName(); File outputFile = moduleToOutputPath.get(moduleName); com.google.common.io.Files.createParentDirs(outputFile); // Reset the source map if it is not going to be reset later in this // loop // when the source map is written to disk. final boolean resetSourceMap = (sourceMapPath == null); String moduleCode = getCodeForModule(moduleName, isDebugMode, moduleNameToUri, resetSourceMap); // Fingerprint the file, if appropriate. if (config.shouldFingerprintJsFiles()) { String fileName = outputFile.getName(); String fingerprint = Md5Util.hashJs(moduleCode); moduleNameToFingerprint.put(moduleName, fingerprint); fileName = insertFingerprintIntoName(fileName, fingerprint); outputFile = new File(outputFile.getParentFile(), fileName); } Files.write(moduleCode, outputFile); // It turns out that the SourceMap will not be populated until after // the // Compiler's internal representation has been output as source // code, so // it should only be written out to a file after the compiled code // has // been generated. if (sourceMapPath != null) { Writer writer = Streams.createFileWriter(sourceMapPath + "_" + moduleName, config); // This is safe because getCodeForModule() was just called, // which has // the side-effect of calling compiler.toSource(module). SourceMap sourceMap = compiler.getSourceMap(); sourceMap.appendTo(writer, moduleName); sourceMap.reset(); Closeables.close(writer, false); } } if (moduleConfig.excludeModuleInfoFromRootModule()) { File outputFile = moduleConfig.getModuleInfoPath(); com.google.common.io.Files.createParentDirs(outputFile); final Function<String, String> fingerprintedModuleNameToUri = new Function<String, String>() { @Override public String apply(String moduleName) { String uri = moduleNameToUri.apply(moduleName); String fingerprint = moduleNameToFingerprint.get(moduleName); if (fingerprint != null) { uri = insertFingerprintIntoName(uri, fingerprint); } return uri; } }; Writer writer = Streams.createFileWriter(outputFile, config); appendRootModuleInfo(writer, isDebugMode, fingerprintedModuleNameToUri); Closeables.close(writer, false); } }