diff --git a/translator/src/org/jetbrains/k2js/K2JSTranslator.java b/translator/src/org/jetbrains/k2js/K2JSTranslator.java index 06c2de8deb2..4fd6e7facf8 100644 --- a/translator/src/org/jetbrains/k2js/K2JSTranslator.java +++ b/translator/src/org/jetbrains/k2js/K2JSTranslator.java @@ -10,9 +10,9 @@ import com.intellij.psi.PsiFileFactory; import com.intellij.psi.impl.PsiFileFactoryImpl; import com.intellij.testFramework.LightVirtualFile; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetCoreEnvironment; import org.jetbrains.jet.compiler.CompileEnvironment; -import org.jetbrains.jet.compiler.CompileEnvironmentException; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamespace; @@ -40,43 +40,57 @@ public final class K2JSTranslator { public K2JSTranslator() { } - public void translateFile(String inputFile, String outputFile) throws Exception { + public void translateFile(@NotNull String inputFile, @NotNull String outputFile) throws Exception { - try { + JetFile PsiFile = loadPsiFile(inputFile); - final File rtJar = CompileEnvironment.findRtJar(true); - myEnvironment.addToClasspath(rtJar); + JsProgram program = generateProgram(PsiFile); - JetNamespace namespace = loadPsiFile(inputFile).getRootNamespace(); - - BindingContext bindingContext = JetTestUtils.analyzeNamespace(namespace, - JetControlFlowDataTraceFactory.EMPTY); - - JsProgram program = Translation.generateAst(bindingContext, namespace, myEnvironment.getProject()); - - CodeGenerator generator = new CodeGenerator(); - generator.generateToFile(program, new File(outputFile)); - - } catch (CompileEnvironmentException e) { - System.out.println(e.getMessage()); - } + CodeGenerator generator = new CodeGenerator(); + generator.generateToFile(program, new File(outputFile)); } - protected String loadFile(String path) throws IOException { + @NotNull + public String translateString(@NotNull String programText) { + JetFile PsiFile = createPsiFile("test", programText); + JsProgram program = generateProgram(PsiFile); + + CodeGenerator generator = new CodeGenerator(); + return generator.generateToString(program); + } + + @NotNull + private JsProgram generateProgram(@NotNull JetFile psiFile) { + final File rtJar = CompileEnvironment.findRtJar(true); + myEnvironment.addToClasspath(rtJar); + + JetNamespace namespace = psiFile.getRootNamespace(); + + BindingContext bindingContext = JetTestUtils.analyzeNamespace(namespace, + JetControlFlowDataTraceFactory.EMPTY); + + return Translation.generateAst(bindingContext, namespace, myEnvironment.getProject()); + } + + @NotNull + protected String loadFile(@NotNull String path) throws IOException { return doLoadFile(path); } - protected String doLoadFile(String path) throws IOException { + @NotNull + protected String doLoadFile(@NotNull String path) throws IOException { String text = FileUtil.loadFile(new File(path), CharsetToolkit.UTF8).trim(); text = StringUtil.convertLineSeparators(text); return text; } - protected JetFile createPsiFile(String name, String text) { + @NotNull + protected JetFile createPsiFile(@NotNull String name, @NotNull String text) { return (JetFile) createFile(name + ".jet", text); } - protected JetFile loadPsiFile(String name) { + @NotNull + protected JetFile loadPsiFile(@NotNull String name) { try { return createPsiFile(name, loadFile(name)); } catch (IOException e) { @@ -84,6 +98,7 @@ public final class K2JSTranslator { } } + @NotNull protected PsiFile createFile(@NonNls String name, String text) { LightVirtualFile virtualFile = new LightVirtualFile(name, JetLanguage.INSTANCE, text); virtualFile.setCharset(CharsetToolkit.UTF8_CHARSET); diff --git a/translator/src/org/jetbrains/k2js/K2JSTranslatorApplet.java b/translator/src/org/jetbrains/k2js/K2JSTranslatorApplet.java new file mode 100644 index 00000000000..0c1ddc42e61 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/K2JSTranslatorApplet.java @@ -0,0 +1,19 @@ +package org.jetbrains.k2js; + +import org.jetbrains.annotations.NotNull; + +import java.applet.Applet; + +/** + * @author Talanov Pavel + */ +public final class K2JSTranslatorApplet extends Applet { + + @NotNull + public String translate(@NotNull String code) { + String generatedCode = (new K2JSTranslator()).translateString(code); + System.out.println("GENERATED JAVASCRIPT CODE:\n-----------------------------------\n"); + System.out.println(generatedCode); + return generatedCode; + } +} diff --git a/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java b/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java index c950ae8b234..7eeefa7e776 100644 --- a/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java +++ b/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java @@ -4,6 +4,7 @@ import com.google.dart.compiler.backend.js.JsSourceGenerationVisitor; import com.google.dart.compiler.backend.js.ast.JsProgram; import com.google.dart.compiler.util.DefaultTextOutput; import com.google.dart.compiler.util.TextOutput; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.FileWriter; @@ -14,25 +15,32 @@ import java.io.IOException; */ public final class CodeGenerator { + @NotNull private final TextOutput output = new DefaultTextOutput(false); public CodeGenerator() { } - public void generateToConsole(JsProgram program) { + public void generateToConsole(@NotNull JsProgram program) { generateCode(program); System.out.println(output.toString()); } - public void generateToFile(JsProgram program, File file) throws IOException { + public void generateToFile(@NotNull JsProgram program, @NotNull File file) throws IOException { generateCode(program); FileWriter writer = new FileWriter(file); writer.write(output.toString()); writer.close(); } - private void generateCode(JsProgram program) { + @NotNull + public String generateToString(@NotNull JsProgram program) { + generateCode(program); + return output.toString(); + } + + private void generateCode(@NotNull JsProgram program) { JsSourceGenerationVisitor sourceGenerator = new JsSourceGenerationVisitor(output); program.traverse(sourceGenerator, null); diff --git a/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java b/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java index 38152b2f9b7..13b5fa0ef39 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java @@ -12,6 +12,8 @@ import java.util.Map; import static org.jetbrains.k2js.translate.utils.BindingUtils.getSuperclassDescriptors; +//TODO: can optimise using less dumb implementation + /** * @author Talanov Pavel */ diff --git a/translator/test/org/jetbrains/k2js/test/AppletTest.java b/translator/test/org/jetbrains/k2js/test/AppletTest.java new file mode 100644 index 00000000000..a39e710acdf --- /dev/null +++ b/translator/test/org/jetbrains/k2js/test/AppletTest.java @@ -0,0 +1,22 @@ +package org.jetbrains.k2js.test; + +import org.jetbrains.k2js.K2JSTranslatorApplet; +import org.junit.Test; + +/** + * @author Talanov Pavel + */ +public final class AppletTest extends TranslationTest { + + final private static String MAIN = "applet/"; + + @Override + protected String mainDirectory() { + return MAIN; + } + + @Test + public void simpleTest() throws Exception { + System.out.println((new K2JSTranslatorApplet()).translate("fun main(args : Array) {}")); + } +}