Refresh FS after compilation for js and sourcemap files.
This commit is contained in:
@@ -23,9 +23,23 @@ public trait OutputFileCollection {
|
||||
public fun asList(): List<OutputFile>
|
||||
}
|
||||
|
||||
public class SimpleOutputFileCollection(private val outputFiles: List<OutputFile>) : OutputFileCollection {
|
||||
override fun get(relativePath: String): OutputFile? = outputFiles.find { it.relativePath == relativePath }
|
||||
override fun asList(): List<OutputFile> = outputFiles
|
||||
}
|
||||
|
||||
public trait OutputFile {
|
||||
public val relativePath: String
|
||||
public val sourceFiles: List<File>
|
||||
public fun asByteArray(): ByteArray
|
||||
public fun asText(): String
|
||||
}
|
||||
|
||||
class SimpleOutputFile(
|
||||
public override val sourceFiles: List<File>,
|
||||
public override val relativePath: String,
|
||||
private val content: String
|
||||
) : OutputFile {
|
||||
override fun asByteArray(): ByteArray = content.toByteArray()
|
||||
override fun asText(): String = content
|
||||
}
|
||||
@@ -16,18 +16,19 @@
|
||||
|
||||
package org.jetbrains.jet.cli.js;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Predicates;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import jet.Function0;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.OutputFileCollection;
|
||||
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
|
||||
import org.jetbrains.jet.cli.common.CLICompiler;
|
||||
import org.jetbrains.jet.cli.common.ExitCode;
|
||||
@@ -37,6 +38,9 @@ import org.jetbrains.jet.cli.common.messages.AnalyzerWithCompilerReport;
|
||||
import org.jetbrains.jet.cli.common.messages.CompilerMessageLocation;
|
||||
import org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity;
|
||||
import org.jetbrains.jet.cli.common.messages.MessageCollector;
|
||||
import org.jetbrains.jet.cli.common.output.OutputDirector;
|
||||
import org.jetbrains.jet.cli.common.output.SingleDirectoryDirector;
|
||||
import org.jetbrains.jet.cli.common.output.outputUtils.OutputUtilsPackage;
|
||||
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
|
||||
import org.jetbrains.jet.config.CommonConfigurationKeys;
|
||||
import org.jetbrains.jet.config.CompilerConfiguration;
|
||||
@@ -84,23 +88,25 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
||||
JetCoreEnvironment environmentForJS = JetCoreEnvironment.createForProduction(rootDisposable, configuration);
|
||||
|
||||
Project project = environmentForJS.getProject();
|
||||
List<JetFile> sourcesFiles = environmentForJS.getSourceFiles();
|
||||
|
||||
ClassPathLibrarySourcesLoader sourceLoader = new ClassPathLibrarySourcesLoader(project);
|
||||
List<JetFile> sourceFiles = sourceLoader.findSourceFiles();
|
||||
environmentForJS.getSourceFiles().addAll(sourceFiles);
|
||||
List<JetFile> additionalSourceFiles = sourceLoader.findSourceFiles();
|
||||
sourcesFiles.addAll(additionalSourceFiles);
|
||||
|
||||
if (arguments.verbose) {
|
||||
reportCompiledSourcesList(messageCollector, environmentForJS);
|
||||
reportCompiledSourcesList(messageCollector, sourcesFiles);
|
||||
}
|
||||
|
||||
String outputFile = arguments.outputFile;
|
||||
if (outputFile == null) {
|
||||
if (arguments.outputFile == null) {
|
||||
messageCollector.report(CompilerMessageSeverity.ERROR, "Specify output file via -output", CompilerMessageLocation.NO_LOCATION);
|
||||
return ExitCode.INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
File outputFile = new File(arguments.outputFile);
|
||||
|
||||
Config config = getConfig(arguments, project);
|
||||
if (analyzeAndReportErrors(messageCollector, environmentForJS.getSourceFiles(), config)) {
|
||||
if (analyzeAndReportErrors(messageCollector, sourcesFiles, config)) {
|
||||
return COMPILATION_ERROR;
|
||||
}
|
||||
|
||||
@@ -127,15 +133,19 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
||||
}
|
||||
|
||||
MainCallParameters mainCallParameters = createMainCallParameters(arguments.main);
|
||||
return translateAndGenerateOutputFile(mainCallParameters, environmentForJS, config, outputFile, outputPrefixFile, outputPostfixFile);
|
||||
|
||||
OutputFileCollection outputFiles = translate(mainCallParameters, config, sourcesFiles, outputFile, outputPrefixFile, outputPostfixFile);
|
||||
|
||||
OutputDirector outputDirector = new SingleDirectoryDirector(outputFile.getParentFile());
|
||||
OutputUtilsPackage.writeAll(outputFiles, outputDirector, messageCollector);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
private static void reportCompiledSourcesList(@NotNull MessageCollector messageCollector,
|
||||
@NotNull JetCoreEnvironment environmentForJS) {
|
||||
List<JetFile> files = environmentForJS.getSourceFiles();
|
||||
Iterable<String> fileNames = Iterables.transform(files, new Function<JetFile, String>() {
|
||||
private static void reportCompiledSourcesList(@NotNull MessageCollector messageCollector, @NotNull List<JetFile> sourceFiles) {
|
||||
Iterable<String> fileNames = ContainerUtil.map(sourceFiles, new Function<JetFile, String>() {
|
||||
@Override
|
||||
public String apply(@Nullable JetFile file) {
|
||||
public String fun(@Nullable JetFile file) {
|
||||
assert file != null;
|
||||
VirtualFile virtualFile = file.getVirtualFile();
|
||||
if (virtualFile != null) {
|
||||
@@ -148,23 +158,20 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
||||
CompilerMessageLocation.NO_LOCATION);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static ExitCode translateAndGenerateOutputFile(
|
||||
private static OutputFileCollection translate(
|
||||
@NotNull MainCallParameters mainCall,
|
||||
@NotNull JetCoreEnvironment environmentForJS,
|
||||
@NotNull Config config,
|
||||
@NotNull String outputFile,
|
||||
@NotNull List<JetFile> sourceFiles,
|
||||
@NotNull File outputFile,
|
||||
@Nullable File outputPrefix,
|
||||
@Nullable File outputPostfix
|
||||
) {
|
||||
try {
|
||||
K2JSTranslator.translateWithMainCallParametersAndSaveToFile(mainCall, environmentForJS.getSourceFiles(),
|
||||
outputFile, outputPrefix, outputPostfix, config);
|
||||
return K2JSTranslator.translateWithMainCallParameters(mainCall, sourceFiles, outputFile, outputPrefix, outputPostfix, config);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
private static boolean analyzeAndReportErrors(@NotNull MessageCollector messageCollector,
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright 2010-2013 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.jet.utils.fileUtils
|
||||
|
||||
import java.io.File
|
||||
|
||||
|
||||
// TODO: move to stdlib as:
|
||||
// public fun File?.readTextOrEmpty(encoding: String = Charset.defaultCharset().name()): String = this?.readText(encoding) ?: ""
|
||||
public fun File?.readTextOrEmpty() : String = this?.readText() ?: ""
|
||||
@@ -18,18 +18,24 @@ package org.jetbrains.jet.plugin.compiler;
|
||||
|
||||
import com.intellij.diagnostic.PluginException;
|
||||
import com.intellij.ide.plugins.PluginManager;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.compiler.*;
|
||||
import com.intellij.openapi.components.ProjectComponent;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.fileTypes.FileType;
|
||||
import com.intellij.openapi.fileTypes.StdFileTypes;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.io.FileUtilRt;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.plugin.JetFileType;
|
||||
|
||||
import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.jetbrains.jet.compiler.runner.CompilerRunnerConstants.INTERNAL_ERROR_PREFIX;
|
||||
import static org.jetbrains.jet.compiler.runner.CompilerRunnerConstants.KOTLIN_COMPILER_NAME;
|
||||
@@ -39,6 +45,7 @@ public class JetCompilerManager implements ProjectComponent {
|
||||
|
||||
// Comes from external make
|
||||
private static final String PREFIX_WITH_COMPILER_NAME = KOTLIN_COMPILER_NAME + ": " + INTERNAL_ERROR_PREFIX;
|
||||
private static final Set<String> FILE_EXTS_WHICH_NEEDS_REFRESH = ContainerUtil.immutableSet(".js", ".map");
|
||||
|
||||
public JetCompilerManager(Project project, CompilerManager manager) {
|
||||
manager.addTranslatingCompiler(new JetCompiler(),
|
||||
@@ -64,6 +71,16 @@ public class JetCompilerManager implements ProjectComponent {
|
||||
|
||||
@Override
|
||||
public void fileGenerated(String outputRoot, String relativePath) {
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) return;
|
||||
|
||||
String ext = FileUtilRt.getExtension(relativePath).toLowerCase();
|
||||
|
||||
if (FILE_EXTS_WHICH_NEEDS_REFRESH.contains(ext)) {
|
||||
String outFile = outputRoot + "/" + relativePath;
|
||||
VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByPath(outFile);
|
||||
assert virtualFile != null : "Virtual file not found for generated file path: " + outFile;
|
||||
virtualFile.refresh(/*async =*/ false, /*recursive =*/ false);
|
||||
}
|
||||
}
|
||||
}, project);
|
||||
}
|
||||
|
||||
@@ -16,14 +16,12 @@
|
||||
|
||||
package org.jetbrains.jet.plugin.compiler;
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.compiler.*;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ModuleOrderEntry;
|
||||
import com.intellij.openapi.roots.ModuleRootManager;
|
||||
import com.intellij.openapi.roots.OrderEntry;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.util.Chunk;
|
||||
import com.intellij.util.Function;
|
||||
@@ -108,12 +106,6 @@ public final class K2JSCompiler implements TranslatingCompiler {
|
||||
KotlinCompilerRunner.runK2JsCompiler(commonArguments, k2jsArguments, compilerSettings, messageCollector, environment,
|
||||
outputItemsCollector, srcFiles, libraryFiles, outFile);
|
||||
|
||||
if (!ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(outDir);
|
||||
assert virtualFile != null : "Virtual file not found for module output: " + outDir;
|
||||
virtualFile.refresh(false, true);
|
||||
}
|
||||
|
||||
TranslatingCompilerUtils.reportOutputs(sink, environment.getOutput(), outputItemsCollector);
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,9 @@ import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.*;
|
||||
|
||||
import static org.jetbrains.jet.cli.common.messages.CompilerMessageLocation.NO_LOCATION;
|
||||
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.*;
|
||||
import static org.jetbrains.jet.compiler.runner.CompilerRunnerConstants.INTERNAL_ERROR_PREFIX;
|
||||
import static org.jetbrains.jet.compiler.runner.KotlinCompilerRunner.runK2JsCompiler;
|
||||
import static org.jetbrains.jet.compiler.runner.KotlinCompilerRunner.runK2JvmCompiler;
|
||||
|
||||
@@ -87,11 +89,11 @@ public class KotlinBuilder extends ModuleLevelBuilder {
|
||||
MessageCollector messageCollector = new MessageCollectorAdapter(context);
|
||||
// Workaround for Android Studio
|
||||
if (!isJavaPluginEnabled(context)) {
|
||||
messageCollector.report(INFO, "Kotlin JPS plugin is disabled", CompilerMessageLocation.NO_LOCATION);
|
||||
messageCollector.report(INFO, "Kotlin JPS plugin is disabled", NO_LOCATION);
|
||||
return ExitCode.NOTHING_DONE;
|
||||
}
|
||||
|
||||
messageCollector.report(INFO, "Kotlin JPS plugin version " + KotlinVersion.VERSION, CompilerMessageLocation.NO_LOCATION);
|
||||
messageCollector.report(INFO, "Kotlin JPS plugin version " + KotlinVersion.VERSION, NO_LOCATION);
|
||||
|
||||
ModuleBuildTarget representativeTarget = chunk.representativeTarget();
|
||||
|
||||
@@ -128,7 +130,7 @@ public class KotlinBuilder extends ModuleLevelBuilder {
|
||||
WARNING, "Circular dependencies are not supported. " +
|
||||
"The following JS modules depend on each other: " + StringUtil.join(chunk.getModules(), MODULE_NAME, ", ") + ". " +
|
||||
"Kotlin is not compiled for these modules",
|
||||
CompilerMessageLocation.NO_LOCATION);
|
||||
NO_LOCATION);
|
||||
return ExitCode.NOTHING_DONE;
|
||||
}
|
||||
|
||||
@@ -152,7 +154,7 @@ public class KotlinBuilder extends ModuleLevelBuilder {
|
||||
WARNING, "Circular dependencies are only partially supported. " +
|
||||
"The following modules depend on each other: " + StringUtil.join(chunk.getModules(), MODULE_NAME, ", ") + ". " +
|
||||
"Kotlin will compile them, but some strange effect may happen",
|
||||
CompilerMessageLocation.NO_LOCATION);
|
||||
NO_LOCATION);
|
||||
}
|
||||
|
||||
File moduleFile = KotlinBuilderModuleScriptGenerator.generateModuleDescription(context, chunk);
|
||||
@@ -178,7 +180,17 @@ public class KotlinBuilder extends ModuleLevelBuilder {
|
||||
}
|
||||
|
||||
for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) {
|
||||
BuildTarget<?> target = sourceToTarget.get(outputItem.getSourceFiles().iterator().next());
|
||||
BuildTarget<?> target = null;
|
||||
Collection<File> sourceFiles = outputItem.getSourceFiles();
|
||||
if (sourceFiles != null && !sourceFiles.isEmpty()) {
|
||||
target = sourceToTarget.get(sourceFiles.iterator().next());
|
||||
}
|
||||
else {
|
||||
messageCollector.report(ERROR,
|
||||
INTERNAL_ERROR_PREFIX + "outputItem.sourceFiles is null or empty, outputItem = " + outputItem,
|
||||
NO_LOCATION);
|
||||
}
|
||||
|
||||
outputConsumer.registerOutputFile(
|
||||
target != null ? target : representativeTarget,
|
||||
outputItem.getOutputFile(),
|
||||
@@ -235,7 +247,7 @@ public class KotlinBuilder extends ModuleLevelBuilder {
|
||||
) {
|
||||
String prefix = "";
|
||||
if (severity == EXCEPTION) {
|
||||
prefix = CompilerRunnerConstants.INTERNAL_ERROR_PREFIX;
|
||||
prefix = INTERNAL_ERROR_PREFIX;
|
||||
}
|
||||
context.processMessage(new CompilerMessage(
|
||||
CompilerRunnerConstants.KOTLIN_COMPILER_NAME,
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<orderEntry type="library" name="idea-full" level="project" />
|
||||
<orderEntry type="library" name="js-libs" level="project" />
|
||||
<orderEntry type="module" module-name="util" />
|
||||
<orderEntry type="module" module-name="backend-common" scope="TEST" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
|
||||
@@ -137,7 +137,7 @@ public abstract class BasicTest extends KotlinTestWithEnvironment {
|
||||
@NotNull EcmaVersion version,
|
||||
@NotNull TestConfigFactory configFactory
|
||||
) throws Exception {
|
||||
TranslationUtils.translateFiles(project, files, outputFile, mainCallParameters, version, configFactory);
|
||||
TranslationUtils.translateFiles(project, mainCallParameters, files, outputFile, version, configFactory);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.jetbrains.k2js.facade.K2JSTranslator;
|
||||
import org.jetbrains.k2js.facade.MainCallParameters;
|
||||
import org.jetbrains.k2js.test.config.TestConfigFactory;
|
||||
import org.jetbrains.k2js.test.semantics.TranslatorTestCaseBuilder;
|
||||
import org.jetbrains.k2js.test.utils.TranslationUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
@@ -62,9 +63,9 @@ public final class OutputPrefixPostfixTest extends SingleFileTranslationTest {
|
||||
@NotNull EcmaVersion version,
|
||||
@NotNull TestConfigFactory configFactory
|
||||
) throws Exception {
|
||||
K2JSTranslator.translateWithMainCallParametersAndSaveToFile(mainCallParameters, createJetFileList(project, files, null),
|
||||
outputFile, outputPrefixFile, outputPostfixFile,
|
||||
getConfig(project, version, configFactory));
|
||||
TranslationUtils.translateFiles(mainCallParameters, createJetFileList(project, files, null),
|
||||
outputFile, outputPrefixFile, outputPostfixFile,
|
||||
getConfig(project, version, configFactory));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,11 +20,11 @@ import com.intellij.openapi.project.Project;
|
||||
import junit.framework.Test;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.k2js.config.EcmaVersion;
|
||||
import org.jetbrains.k2js.facade.K2JSTranslator;
|
||||
import org.jetbrains.k2js.facade.MainCallParameters;
|
||||
import org.jetbrains.k2js.test.config.TestConfig;
|
||||
import org.jetbrains.k2js.test.config.TestConfigFactory;
|
||||
import org.jetbrains.k2js.test.semantics.TranslatorTestCaseBuilder;
|
||||
import org.jetbrains.k2js.test.utils.TranslationUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -52,9 +52,9 @@ public final class SourcemapTest extends SingleFileTranslationTest {
|
||||
@NotNull EcmaVersion version,
|
||||
@NotNull TestConfigFactory configFactory
|
||||
) throws Exception {
|
||||
K2JSTranslator.translateWithMainCallParametersAndSaveToFile(mainCallParameters, createJetFileList(project, files, null),
|
||||
outputFile, null, null,
|
||||
getConfig(project, version, configFactory));
|
||||
TranslationUtils.translateFiles(mainCallParameters, createJetFileList(project, files, null),
|
||||
outputFile, null, null,
|
||||
getConfig(project, version, configFactory));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -23,14 +23,16 @@ import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.OutputFileCollection;
|
||||
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
|
||||
import org.jetbrains.jet.cli.common.output.outputUtils.OutputUtilsPackage;
|
||||
import org.jetbrains.jet.lang.psi.JetFile;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS;
|
||||
import org.jetbrains.k2js.config.Config;
|
||||
import org.jetbrains.k2js.config.EcmaVersion;
|
||||
import org.jetbrains.k2js.facade.K2JSTranslator;
|
||||
import org.jetbrains.k2js.facade.MainCallParameters;
|
||||
import org.jetbrains.k2js.facade.exceptions.TranslationException;
|
||||
import org.jetbrains.k2js.test.config.TestConfigFactory;
|
||||
import org.jetbrains.k2js.utils.JetFileUtils;
|
||||
|
||||
@@ -39,6 +41,8 @@ import java.io.IOException;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.k2js.facade.K2JSTranslator.translateWithMainCallParameters;
|
||||
|
||||
//TODO: use method object
|
||||
public final class TranslationUtils {
|
||||
|
||||
@@ -95,13 +99,30 @@ public final class TranslationUtils {
|
||||
return configFactory.create(project, version, getLibFilesWithCode(getAllLibFiles(project)), preanalyzedContext);
|
||||
}
|
||||
|
||||
public static void translateFiles(@NotNull Project project, @NotNull List<String> inputFiles,
|
||||
@NotNull String outputFile,
|
||||
public static void translateFiles(
|
||||
@NotNull Project project,
|
||||
@NotNull MainCallParameters mainCallParameters,
|
||||
@NotNull EcmaVersion version, TestConfigFactory configFactory) throws Exception {
|
||||
@NotNull List<String> inputFiles,
|
||||
@NotNull String outputFile,
|
||||
@NotNull EcmaVersion version,
|
||||
@NotNull TestConfigFactory configFactory
|
||||
) throws Exception {
|
||||
List<JetFile> jetFiles = createJetFileList(project, inputFiles, null);
|
||||
K2JSTranslator translator = new K2JSTranslator(getConfig(project, version, configFactory));
|
||||
FileUtil.writeToFile(new File(outputFile), translator.generateProgramCode(jetFiles, mainCallParameters));
|
||||
Config config = getConfig(project, version, configFactory);
|
||||
translateFiles(mainCallParameters, jetFiles, outputFile, null, null, config);
|
||||
}
|
||||
|
||||
public static void translateFiles(
|
||||
@NotNull MainCallParameters mainCall,
|
||||
@NotNull List<JetFile> files,
|
||||
@NotNull String outputPath,
|
||||
@Nullable File outputPrefixFile,
|
||||
@Nullable File outputPostfixFile,
|
||||
@NotNull Config config
|
||||
) throws TranslationException, IOException {
|
||||
File outputFile = new File(outputPath);
|
||||
OutputFileCollection outputFiles = translateWithMainCallParameters(mainCall, files, outputFile, outputPrefixFile, outputPostfixFile, config);
|
||||
OutputUtilsPackage.writeAllTo(outputFiles, outputFile.getParentFile());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<orderEntry type="library" name="js-libs" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="intellij-core" level="project" />
|
||||
<orderEntry type="module" module-name="util" />
|
||||
<orderEntry type="module" module-name="backend-common" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
|
||||
@@ -19,12 +19,20 @@ package org.jetbrains.k2js.facade;
|
||||
import com.google.dart.compiler.backend.js.ast.JsProgram;
|
||||
import com.google.dart.compiler.util.TextOutputImpl;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.OutputFileCollection;
|
||||
import org.jetbrains.jet.SimpleOutputFile;
|
||||
import org.jetbrains.jet.SimpleOutputFileCollection;
|
||||
import org.jetbrains.jet.lang.psi.JetFile;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.utils.fileUtils.FileUtilsPackage;
|
||||
import org.jetbrains.js.compiler.JsSourceGenerationVisitor;
|
||||
import org.jetbrains.js.compiler.sourcemap.SourceMap3Builder;
|
||||
import org.jetbrains.js.compiler.sourcemap.SourceMapBuilder;
|
||||
@@ -49,44 +57,49 @@ public final class K2JSTranslator {
|
||||
public static final String FLUSH_SYSTEM_OUT = "Kotlin.System.flush();\n";
|
||||
public static final String GET_SYSTEM_OUT = "Kotlin.System.output();\n";
|
||||
|
||||
public static void translateWithMainCallParametersAndSaveToFile(
|
||||
public static OutputFileCollection translateWithMainCallParameters(
|
||||
@NotNull MainCallParameters mainCall,
|
||||
@NotNull List<JetFile> files,
|
||||
@NotNull String outputPath,
|
||||
@NotNull File outputFile,
|
||||
@Nullable File outputPrefixFile,
|
||||
@Nullable File outputPostfixFile,
|
||||
@NotNull Config config
|
||||
) throws TranslationException, IOException {
|
||||
K2JSTranslator translator = new K2JSTranslator(config);
|
||||
File outFile = new File(outputPath);
|
||||
TextOutputImpl output = new TextOutputImpl();
|
||||
SourceMapBuilder sourceMapBuilder = config.isSourcemap() ? new SourceMap3Builder(outFile, output, new SourceMapBuilderConsumer()) : null;
|
||||
SourceMapBuilder sourceMapBuilder = config.isSourcemap() ? new SourceMap3Builder(outputFile, output, new SourceMapBuilderConsumer()) : null;
|
||||
String programCode = translator.generateProgramCode(files, mainCall, output, sourceMapBuilder);
|
||||
|
||||
if (outputPrefixFile != null) {
|
||||
String prefix = FileUtil.loadFile(outputPrefixFile);
|
||||
FileUtil.writeToFile(outFile, prefix);
|
||||
if (sourceMapBuilder != null) {
|
||||
sourceMapBuilder.skipLinesInBegin(StringUtil.getLineBreakCount(prefix));
|
||||
String prefix = FileUtilsPackage.readTextOrEmpty(outputPrefixFile);
|
||||
String postfix = FileUtilsPackage.readTextOrEmpty(outputPostfixFile);
|
||||
|
||||
StringBuilder outBuilder = new StringBuilder(programCode.length() + prefix.length() + postfix.length());
|
||||
outBuilder.append(prefix).append(programCode).append(postfix);
|
||||
|
||||
List<File> sourceFiles = ContainerUtil.map(files, new Function<JetFile, File>() {
|
||||
@Override
|
||||
public File fun(JetFile file) {
|
||||
VirtualFile virtualFile = file.getOriginalFile().getVirtualFile();
|
||||
if (virtualFile == null) return new File(file.getName());
|
||||
return VfsUtilCore.virtualToIoFile(virtualFile);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
FileUtil.writeToFile(outFile, programCode.getBytes(), outputPrefixFile != null);
|
||||
|
||||
if (outputPostfixFile != null) {
|
||||
byte[] postfix = FileUtil.loadFileBytes(outputPostfixFile);
|
||||
FileUtil.writeToFile(outFile, postfix, true);
|
||||
}
|
||||
SimpleOutputFile jsFile = new SimpleOutputFile(sourceFiles, outputFile.getName(), outBuilder.toString());
|
||||
List<SimpleOutputFile> outputFiles = new SmartList<SimpleOutputFile>(jsFile);
|
||||
|
||||
if (sourceMapBuilder != null) {
|
||||
FileUtil.writeToFile(sourceMapBuilder.getOutFile(), sourceMapBuilder.build());
|
||||
sourceMapBuilder.skipLinesInBegin(StringUtil.getLineBreakCount(prefix));
|
||||
SimpleOutputFile sourcemapFile = new SimpleOutputFile(sourceFiles, sourceMapBuilder.getOutFile().getName(), sourceMapBuilder.build());
|
||||
outputFiles.add(sourcemapFile);
|
||||
}
|
||||
|
||||
return new SimpleOutputFileCollection(outputFiles);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private final Config config;
|
||||
|
||||
|
||||
public K2JSTranslator(@NotNull Config config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user