diff --git a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java index 502fc5bc735..e13414a7dce 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java @@ -23,6 +23,7 @@ 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.Consumer; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import kotlin.Function0; @@ -48,7 +49,6 @@ import org.jetbrains.jet.config.Services; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.k2js.analyze.TopDownAnalyzerFacadeForJS; import org.jetbrains.k2js.config.*; -import org.jetbrains.k2js.facade.K2JSTranslator; import org.jetbrains.k2js.facade.MainCallParameters; import java.io.File; @@ -58,6 +58,7 @@ import java.util.List; import static org.jetbrains.jet.cli.common.ExitCode.COMPILATION_ERROR; import static org.jetbrains.jet.cli.common.ExitCode.OK; import static org.jetbrains.jet.cli.common.messages.CompilerMessageLocation.NO_LOCATION; +import static org.jetbrains.k2js.facade.K2JSTranslator.translateWithMainCallParameters; public class K2JSCompiler extends CLICompiler { @@ -170,7 +171,8 @@ public class K2JSCompiler extends CLICompiler { @Nullable File outputPostfix ) { try { - return K2JSTranslator.translateWithMainCallParameters(mainCall, sourceFiles, outputFile, outputPrefix, outputPostfix, config); + //noinspection unchecked + return translateWithMainCallParameters(mainCall, sourceFiles, outputFile, outputPrefix, outputPostfix, config, Consumer.EMPTY_CONSUMER); } catch (Exception e) { throw new RuntimeException(e); @@ -213,4 +215,4 @@ public class K2JSCompiler extends CLICompiler { return MainCallParameters.mainWithoutArguments(); } } -} \ No newline at end of file +} diff --git a/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java b/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java index 32fa16d371b..f433f5d1b0c 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java @@ -19,11 +19,14 @@ package org.jetbrains.k2js.test; import com.google.common.collect.Lists; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.config.CompilerConfiguration; +import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment; +import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.test.config.TestConfig; @@ -119,9 +122,15 @@ public abstract class BasicTest extends KotlinTestWithEnvironment { @NotNull Iterable ecmaVersions, @NotNull TestConfigFactory configFactory ) throws Exception { + Project project = getProject(); + List allFiles = withAdditionalFiles(files); + List jetFiles = TranslationUtils.createJetFileList(project, allFiles, null); + for (EcmaVersion version : ecmaVersions) { - translateFiles(getProject(), withAdditionalFiles(files), getOutputFilePath(testName, version), mainCallParameters, - version, configFactory); + Config config = TranslationUtils.getConfig(project, version, configFactory); + File outputFile = new File(getOutputFilePath(testName, version)); + + translateFiles(jetFiles, outputFile, mainCallParameters, config); } } @@ -135,14 +144,13 @@ public abstract class BasicTest extends KotlinTestWithEnvironment { } protected void translateFiles( - @NotNull Project project, - @NotNull List files, - @NotNull String outputFile, + @NotNull List jetFiles, + @NotNull File outputFile, @NotNull MainCallParameters mainCallParameters, - @NotNull EcmaVersion version, - @NotNull TestConfigFactory configFactory + @NotNull Config config ) throws Exception { - TranslationUtils.translateFiles(project, mainCallParameters, files, outputFile, version, configFactory); + //noinspection unchecked + TranslationUtils.translateFiles(mainCallParameters, jetFiles, outputFile, null, null, config, Consumer.EMPTY_CONSUMER); } @NotNull @@ -235,5 +243,4 @@ public abstract class BasicTest extends KotlinTestWithEnvironment { protected String expected(@NotNull String testName) { return getExpectedPath() + testName + ".out"; } - } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/OutputPrefixPostfixTest.java b/js/js.tests/test/org/jetbrains/k2js/test/OutputPrefixPostfixTest.java index 0aa3fa445fa..89f71ecff90 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/OutputPrefixPostfixTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/OutputPrefixPostfixTest.java @@ -16,24 +16,21 @@ package org.jetbrains.k2js.test; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.Consumer; import junit.framework.Test; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.psi.JetFile; +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.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; -import static org.jetbrains.k2js.test.utils.TranslationUtils.createJetFileList; -import static org.jetbrains.k2js.test.utils.TranslationUtils.getConfig; - @SuppressWarnings("JUnitTestCaseWithNoTests") public final class OutputPrefixPostfixTest extends SingleFileTranslationTest { private static final String PREFIX_EXT = ".prefix"; @@ -56,16 +53,13 @@ public final class OutputPrefixPostfixTest extends SingleFileTranslationTest { @Override protected void translateFiles( - @NotNull Project project, - @NotNull List files, - @NotNull String outputFile, + @NotNull List jetFiles, + @NotNull File outputFile, @NotNull MainCallParameters mainCallParameters, - @NotNull EcmaVersion version, - @NotNull TestConfigFactory configFactory + @NotNull Config config ) throws Exception { - TranslationUtils.translateFiles(mainCallParameters, createJetFileList(project, files, null), - outputFile, outputPrefixFile, outputPostfixFile, - getConfig(project, version, configFactory)); + //noinspection unchecked + TranslationUtils.translateFiles(mainCallParameters, jetFiles, outputFile, outputPrefixFile, outputPostfixFile, config, Consumer.EMPTY_CONSUMER); } @Override diff --git a/js/js.tests/test/org/jetbrains/k2js/test/SourceMapTest.java b/js/js.tests/test/org/jetbrains/k2js/test/SourceMapTest.java index 38d7b36774a..df0c26dd64c 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/SourceMapTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/SourceMapTest.java @@ -16,20 +16,11 @@ package org.jetbrains.k2js.test; -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.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; - -import static org.jetbrains.k2js.test.utils.TranslationUtils.createJetFileList; -import static org.jetbrains.k2js.test.utils.TranslationUtils.getConfig; @SuppressWarnings("JUnitTestCaseWithNoTests") public final class SourceMapTest extends SingleFileTranslationTest { @@ -42,20 +33,6 @@ public final class SourceMapTest extends SingleFileTranslationTest { this.filename = filename; } - @Override - protected void translateFiles( - @NotNull Project project, - @NotNull List files, - @NotNull String outputFile, - @NotNull MainCallParameters mainCallParameters, - @NotNull EcmaVersion version, - @NotNull TestConfigFactory configFactory - ) throws Exception { - TranslationUtils.translateFiles(mainCallParameters, createJetFileList(project, files, null), - outputFile, null, null, - getConfig(project, version, configFactory)); - } - @NotNull @Override protected TestConfigFactory getConfigFactory() { diff --git a/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java b/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java index b43b2596b3e..a3e38920754 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java @@ -18,9 +18,12 @@ package org.jetbrains.k2js.test.utils; import com.google.common.base.Predicate; import com.google.common.collect.Lists; +import com.google.dart.compiler.backend.js.ast.JsNode; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.PsiFile; +import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.OutputFileCollection; @@ -99,30 +102,38 @@ public final class TranslationUtils { libraryAnalyzeExhaust.getBindingContext(), libraryAnalyzeExhaust.getModuleDescriptor()); } - public static void translateFiles( - @NotNull Project project, - @NotNull MainCallParameters mainCallParameters, - @NotNull List inputFiles, - @NotNull String outputFile, - @NotNull EcmaVersion version, - @NotNull TestConfigFactory configFactory - ) throws Exception { - List jetFiles = createJetFileList(project, inputFiles, null); - Config config = getConfig(project, version, configFactory); - translateFiles(mainCallParameters, jetFiles, outputFile, null, null, config); - } - public static void translateFiles( @NotNull MainCallParameters mainCall, @NotNull List files, - @NotNull String outputPath, + @NotNull File outputFile, + @Nullable File outputPrefixFile, + @Nullable File outputPostfixFile, + @NotNull Config config, + @NotNull Consumer astConsumer + ) throws TranslationException, IOException { + OutputFileCollection outputFiles = + translateWithMainCallParameters(mainCall, files, outputFile, outputPrefixFile, outputPostfixFile, config, astConsumer); + OutputUtilsPackage.writeAllTo(outputFiles, outputFile.getParentFile()); + } + + public static JsNode translateFilesAndGetAst( + @NotNull MainCallParameters mainCall, + @NotNull List files, + @NotNull File outputFile, @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()); + final Ref ref = new Ref(); + + translateFiles(mainCall, files, outputFile, outputPrefixFile, outputPostfixFile, config, new Consumer() { + @Override + public void consume(JsNode node) { + ref.set(node); + } + }); + + return ref.get(); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java index 494c8ccfae5..929a0d35a67 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -17,6 +17,7 @@ package org.jetbrains.k2js.facade; import com.google.common.base.Predicates; +import com.google.dart.compiler.backend.js.ast.JsNode; import com.google.dart.compiler.backend.js.ast.JsProgram; import com.google.dart.compiler.util.TextOutputImpl; import com.intellij.openapi.project.Project; @@ -24,6 +25,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; +import com.intellij.util.Consumer; import com.intellij.util.Function; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; @@ -67,12 +69,13 @@ public final class K2JSTranslator { @NotNull File outputFile, @Nullable File outputPrefixFile, @Nullable File outputPostfixFile, - @NotNull Config config + @NotNull Config config, + @NotNull Consumer astConsumer // hack for tests ) throws TranslationException, IOException { K2JSTranslator translator = new K2JSTranslator(config); TextOutputImpl output = new TextOutputImpl(); SourceMapBuilder sourceMapBuilder = config.isSourcemap() ? new SourceMap3Builder(outputFile, output, new SourceMapBuilderConsumer()) : null; - String programCode = translator.generateProgramCode(files, mainCall, output, sourceMapBuilder); + String programCode = translator.generateProgramCode(files, mainCall, output, sourceMapBuilder, astConsumer); String prefix = FileUtilsPackage.readTextOrEmpty(outputPrefixFile); String postfix = FileUtilsPackage.readTextOrEmpty(outputPostfixFile); @@ -125,7 +128,8 @@ public final class K2JSTranslator { @NotNull public String generateProgramCode(@NotNull List files, @NotNull MainCallParameters mainCallParameters) throws TranslationException { - return generateProgramCode(files, mainCallParameters, new TextOutputImpl(), null); + //noinspection unchecked + return generateProgramCode(files, mainCallParameters, new TextOutputImpl(), null, Consumer.EMPTY_CONSUMER); } @NotNull @@ -133,11 +137,16 @@ public final class K2JSTranslator { @NotNull List files, @NotNull MainCallParameters mainCallParameters, @NotNull TextOutputImpl output, - @Nullable SourceMapBuilder sourceMapBuilder + @Nullable SourceMapBuilder sourceMapBuilder, + @NotNull Consumer astConsumer ) throws TranslationException { JsProgram program = generateProgram(files, mainCallParameters); + JsSourceGenerationVisitor sourceGenerator = new JsSourceGenerationVisitor(output, sourceMapBuilder); program.accept(sourceGenerator); + + astConsumer.consume(program); + return output.toString(); } @@ -156,4 +165,4 @@ public final class K2JSTranslator { private Project getProject() { return config.getProject(); } -} \ No newline at end of file +}