diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 64f96021da8..f393e9fffb8 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -10,13 +10,22 @@ - + + + - + + + + + + + + @@ -36,10 +45,10 @@ org.jetbrains.k2js.translate.* - + org.jetbrains.k2js.* - + org.jetbrains.k2js.* @@ -217,19 +226,6 @@ @@ -287,7 +283,7 @@ - + @@ -299,10 +295,10 @@ - + - + @@ -311,19 +307,17 @@ - + - + - - - - + + @@ -386,57 +380,88 @@ - - + + - + + + + + + + + + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + - + - - + + - + - - + + - + @@ -451,33 +476,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -503,22 +501,22 @@ @@ -733,6 +731,16 @@ + + + + + + + + @@ -840,6 +848,10 @@ @@ -865,62 +877,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -942,9 +898,9 @@ - - + + @@ -1168,17 +1124,6 @@ @@ -1477,94 +1433,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1572,7 +1440,7 @@ - + @@ -1586,15 +1454,103 @@ - + - + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jslib/src/core/javautil.kt b/jslib/src/core/javautil.kt index 98b36fe0cec..f9987cf76a6 100644 --- a/jslib/src/core/javautil.kt +++ b/jslib/src/core/javautil.kt @@ -58,13 +58,16 @@ public trait List : Collection { open public fun get(index : Int) : E open public fun set(index : Int, element : E) : E open public fun add(index : Int, element : E) : Unit + js_name("remove_foo") open public fun remove(index : Int) : E? open public fun indexOf(o : Any?) : Int open public fun lastIndexOf(o : Any?) : Int open public fun subList(fromIndex : Int, toIndex : Int) : List? + js_name("remove_foo") override public fun remove(o : Any?) : Boolean } +annotation class js_name(s : String) trait Set : Collection diff --git a/jslib/src/jquery/common.kt b/jslib/src/jquery/common.kt index 29cc41dfdb2..c0fa8297599 100644 --- a/jslib/src/jquery/common.kt +++ b/jslib/src/jquery/common.kt @@ -1,26 +1,36 @@ package jquery; fun fail() : Nothing = throw RuntimeException(); - fun JQuery.toString() = "" class JQuery() { fun addClass(className : String) : JQuery = fail(); fun attr(attrName : String) = "" fun attr(attrName : String, value : String) = this - fun hasClass(attrName : String) = true + fun hasClass(className : String) = true + fun removeClass(className : String) = this fun html() : String = "" fun height() = 0 fun width() = 0 fun click() = this; - fun click(handler : (DomElement)->Unit) = this; + fun click(handler : DomElement.()->Unit) = this; fun append(str : String) = this; + fun ready(handler : ()->Unit) = this; + fun text(text : String) = this; + fun slideUp() = this; + fun hover(handlerInOut : DomElement.() -> Unit) = this; + fun hover(handlerIn : DomElement.() -> Unit, handlerOut : DomElement.() -> Unit) = this; } -class DomElement() { +open class DomElement() { + } +//val document = object : DomElement() {} + fun jq(selector : String) = JQuery(); fun jq(selector : String, context : DomElement) = JQuery(); fun jq(callback : () -> Unit) = JQuery(); fun jq(obj : JQuery) = JQuery(); +fun jq(el : DomElement) = JQuery(); +fun jq() = JQuery(); diff --git a/translator/src/org/jetbrains/k2js/Analyzer.java b/translator/src/org/jetbrains/k2js/Analyzer.java index a675e90f905..3715e965966 100644 --- a/translator/src/org/jetbrains/k2js/Analyzer.java +++ b/translator/src/org/jetbrains/k2js/Analyzer.java @@ -41,11 +41,7 @@ public final class Analyzer { @NotNull public static BindingContext analyzeFiles(@NotNull List files, - @Nullable Project externalProject) { - Project project = externalProject; - if (project == null) { - project = getProject(files); - } + @NotNull Project project) { final List jsLibFiles = getJsSupportStdLib(project); List allFiles = allFiles(files, jsLibFiles); return AnalyzingUtils.analyzeFiles(project, JsConfiguration.jsLibConfiguration(project), diff --git a/translator/src/org/jetbrains/k2js/Config.java b/translator/src/org/jetbrains/k2js/Config.java new file mode 100644 index 00000000000..5a51287c2c1 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/Config.java @@ -0,0 +1,13 @@ +package org.jetbrains.k2js; + +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * @author Pavel Talanov + */ +public interface Config { + + @NotNull + Project getProject(); +} diff --git a/translator/src/org/jetbrains/k2js/IDEAConfig.java b/translator/src/org/jetbrains/k2js/IDEAConfig.java new file mode 100644 index 00000000000..2b35c1eac89 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/IDEAConfig.java @@ -0,0 +1,23 @@ +package org.jetbrains.k2js; + +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * @author Pavel Talanov + */ +public final class IDEAConfig implements Config { + + @NotNull + private final Project project; + + public IDEAConfig(@NotNull Project project) { + this.project = project; + } + + @NotNull + @Override + public Project getProject() { + return project; + } +} diff --git a/translator/src/org/jetbrains/k2js/K2JSTranslator.java b/translator/src/org/jetbrains/k2js/K2JSTranslator.java index 532f589d7a1..4e798993005 100644 --- a/translator/src/org/jetbrains/k2js/K2JSTranslator.java +++ b/translator/src/org/jetbrains/k2js/K2JSTranslator.java @@ -3,8 +3,8 @@ package org.jetbrains.k2js; import com.google.dart.compiler.backend.js.ast.JsProgram; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetNamespaceHeader; import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.k2js.generate.CodeGenerator; @@ -20,8 +20,7 @@ import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getNamespaceDescriptor; -import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getNameForNamespace; +import static org.jetbrains.k2js.utils.JetFileUtils.createPsiFileList; //TODO: clean up the code @@ -30,66 +29,51 @@ import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getNameForNames */ public final class K2JSTranslator { - public static void translatePsiFile(@NotNull JetFile file, - @NotNull String outputFile, - @NotNull Project project) throws Exception { - (new K2JSTranslator()).generateAndSaveProgram(file, outputFile, project); - } - - public static void doNothing() { - - } - public static void translateWithCallToMainAndSaveToFile(@NotNull JetFile file, @NotNull String outputPath, @NotNull Project project) throws Exception { - K2JSTranslator translator = new K2JSTranslator(); - String programCode = translator.generateProgramCode(file, project) + "\n"; + K2JSTranslator translator = new K2JSTranslator(new IDEAConfig(project)); + String programCode = translator.generateProgramCode(file) + "\n"; String callToMain = translator.generateCallToMain(file, ""); FileWriter writer = new FileWriter(new File(outputPath)); writer.write(programCode + callToMain); writer.close(); } - @Nullable - private BindingContext bindingContext = null; - - public K2JSTranslator() { - } - - public void testTranslateFile(@NotNull String inputFile, @NotNull String outputFile) throws Exception { - JetFile psiFile = JetFileUtils.loadPsiFile(inputFile, null); - generateAndSaveProgram(psiFile, outputFile, null); - } - - private void generateAndSaveProgram(@NotNull JetFile psiFile, - @NotNull String outputFile, - @Nullable Project project) throws IOException { - JsProgram program = generateProgram(Arrays.asList(psiFile), project); - CodeGenerator generator = new CodeGenerator(); - generator.generateToFile(program, new File(outputFile)); - } - - public void testTranslateFiles(@NotNull List inputFiles, @NotNull String outputFile) throws Exception { - List psiFiles = createPsiFileList(inputFiles); - JsProgram program = generateProgram(psiFiles, null); - CodeGenerator generator = new CodeGenerator(); - generator.generateToFile(program, new File(outputFile)); + public static void testTranslateFile(@NotNull String inputFile, @NotNull String outputFile) throws Exception { + K2JSTranslator translator = new K2JSTranslator(new TestConfig()); + JetFile psiFile = JetFileUtils.loadPsiFile(inputFile, translator.getProject()); + translator.generateAndSaveProgram(psiFile, outputFile); } @NotNull - private List createPsiFileList(@NotNull List inputFiles) { - List psiFiles = new ArrayList(); - for (String inputFile : inputFiles) { - psiFiles.add(JetFileUtils.loadPsiFile(inputFile, null)); - } - return psiFiles; + private Config config; + + public K2JSTranslator(@NotNull Config config) { + this.config = config; + } + + + private void generateAndSaveProgram(@NotNull JetFile psiFile, + @NotNull String outputFile) throws IOException { + JsProgram program = generateProgram(Arrays.asList(psiFile)); + CodeGenerator generator = new CodeGenerator(); + generator.generateToFile(program, new File(outputFile)); + } + + public static void testTranslateFiles(@NotNull List inputFiles, @NotNull String outputFile) + throws Exception { + K2JSTranslator translator = new K2JSTranslator(new TestConfig()); + List psiFiles = createPsiFileList(inputFiles, translator.getProject()); + JsProgram program = translator.generateProgram(psiFiles); + CodeGenerator generator = new CodeGenerator(); + generator.generateToFile(program, new File(outputFile)); } @NotNull public String translateStringWithCallToMain(@NotNull String programText, @NotNull String argumentsString) { - JetFile file = JetFileUtils.createPsiFile("test", programText, null); - String programCode = generateProgramCode(file, null) + "\n"; + JetFile file = JetFileUtils.createPsiFile("test", programText, getProject()); + String programCode = generateProgramCode(file) + "\n"; String flushOutput = "Kotlin.System.flush();\n"; String callToMain = generateCallToMain(file, argumentsString); String programOutput = "Kotlin.System.output();\n"; @@ -97,23 +81,20 @@ public final class K2JSTranslator { } @NotNull - private String generateProgramCode(@NotNull JetFile psiFile, - @Nullable Project project) { - JsProgram program = generateProgram(Arrays.asList(psiFile), project); + private String generateProgramCode(@NotNull JetFile psiFile) { + JsProgram program = generateProgram(Arrays.asList(psiFile)); CodeGenerator generator = new CodeGenerator(); return generator.generateToString(program); } @NotNull - private JsProgram generateProgram(@NotNull List files, - @Nullable Project project) { - bindingContext = Analyzer.analyzeFiles(files, project); + private JsProgram generateProgram(@NotNull List files) { + BindingContext bindingContext = Analyzer.analyzeFiles(files, config.getProject()); for (JetFile file : files) { AnalyzingUtils.checkForSyntacticErrors(file); AnalyzingUtils.throwExceptionOnErrors(bindingContext); } - assert bindingContext != null; JetFile file = files.iterator().next(); return Translation.generateAst(bindingContext, file, file.getProject()); } @@ -138,8 +119,15 @@ public final class K2JSTranslator { @NotNull private String getRootNamespaceName(@NotNull JetFile psiFile) { - assert bindingContext != null; - return getNameForNamespace(getNamespaceDescriptor(bindingContext, psiFile)); + JetNamespaceHeader namespaceHeader = psiFile.getNamespaceHeader(); + String name = namespaceHeader.getName(); + assert name != null : "NamespaceHeader must have a name"; + return name; + } + + @NotNull + private Project getProject() { + return config.getProject(); } } diff --git a/translator/src/org/jetbrains/k2js/K2JSTranslatorApplet.java b/translator/src/org/jetbrains/k2js/K2JSTranslatorApplet.java index 77b030175fb..e8d9e5e36a2 100644 --- a/translator/src/org/jetbrains/k2js/K2JSTranslatorApplet.java +++ b/translator/src/org/jetbrains/k2js/K2JSTranslatorApplet.java @@ -36,7 +36,7 @@ public final class K2JSTranslatorApplet extends Applet { @NotNull private String generateJSCode(@NotNull String code, @NotNull String arguments) { - String generatedCode = (new K2JSTranslator()).translateStringWithCallToMain(code, arguments); + String generatedCode = (new K2JSTranslator(new TestConfig())).translateStringWithCallToMain(code, arguments); System.out.println("GENERATED JAVASCRIPT CODE:\n-----------------------------------\n"); System.out.println(generatedCode); return generatedCode; diff --git a/translator/src/org/jetbrains/k2js/TestConfig.java b/translator/src/org/jetbrains/k2js/TestConfig.java new file mode 100644 index 00000000000..673d087df37 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/TestConfig.java @@ -0,0 +1,37 @@ +package org.jetbrains.k2js; + +import com.intellij.openapi.Disposable; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.compiler.JetCoreEnvironment; + +/** + * @author Pavel Talanov + */ +public final class TestConfig implements Config { + + @NotNull + private static JetCoreEnvironment getTestEnvironment() { + if (testOnlyEnvironment == null) { + testOnlyEnvironment = new JetCoreEnvironment(new Disposable() { + @Override + public void dispose() { + } + }); + } + return testOnlyEnvironment; + } + + @Nullable + private static /*var*/ JetCoreEnvironment testOnlyEnvironment = null; + + public TestConfig() { + } + + @NotNull + @Override + public Project getProject() { + return getTestEnvironment().getProject(); + } +} diff --git a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java index fe520679c42..e6a77550517 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java +++ b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java @@ -103,9 +103,11 @@ public final class StandardClasses { private static void declareJQuery(@NotNull StandardClasses standardClasses) { standardClasses.declare().forFQ("jquery.JQuery").externalClass("jQuery") - .methods("addClass", "attr", "hasClass", "append", "text", "ready"); + .methods("addClass", "attr", "hasClass", "append", + "text", "ready", "click", "hover", "slideUp", + "removeClass"); standardClasses.declare().forFQ("jquery.jq").externalFunction("jQuery"); - standardClasses.declare().forFQ("jquery.get-document").externalObject("document"); + //standardClasses.declare().forFQ("jquery.get-document").externalObject("document"); } //TODO: test all the methods diff --git a/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java b/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java index e06a7e9e177..ff9bceaf284 100644 --- a/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java +++ b/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java @@ -1,6 +1,5 @@ package org.jetbrains.k2js.utils; -import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -10,27 +9,19 @@ import com.intellij.psi.PsiFileFactory; import com.intellij.psi.impl.PsiFileFactoryImpl; import com.intellij.testFramework.LightVirtualFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.compiler.JetCoreEnvironment; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.plugin.JetLanguage; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * @author Pavel Talanov */ public final class JetFileUtils { - @NotNull - private static JetCoreEnvironment testOnlyEnvironment = new JetCoreEnvironment(new Disposable() { - - @Override - public void dispose() { - } - }); - @NotNull public static String loadFile(@NotNull String path) throws IOException { return doLoadFile(path); @@ -46,12 +37,12 @@ public final class JetFileUtils { @NotNull public static JetFile createPsiFile(@NotNull String name, @NotNull String text, - @Nullable Project project) { + @NotNull Project project) { return (JetFile) createFile(name + ".jet", text, project); } @NotNull - public static JetFile loadPsiFile(@NotNull String name, @Nullable Project project) { + public static JetFile loadPsiFile(@NotNull String name, @NotNull Project project) { try { return createPsiFile(name, loadFile(name), project); } catch (IOException e) { @@ -60,18 +51,23 @@ public final class JetFileUtils { } @NotNull - private static PsiFile createFile(@NotNull String name, @NotNull String text, @Nullable Project project) { + private static PsiFile createFile(@NotNull String name, @NotNull String text, @NotNull Project project) { LightVirtualFile virtualFile = new LightVirtualFile(name, JetLanguage.INSTANCE, text); virtualFile.setCharset(CharsetToolkit.UTF8_CHARSET); - Project realProject = project; - if (realProject == null) { - realProject = testOnlyEnvironment.getProject(); - //throw new RuntimeException(); - } - PsiFile result = ((PsiFileFactoryImpl) PsiFileFactory.getInstance(realProject)) + PsiFile result = ((PsiFileFactoryImpl) PsiFileFactory.getInstance(project)) .trySetupPsiForFile(virtualFile, JetLanguage.INSTANCE, true, false); assert result != null; return result; } + + @NotNull + public static List createPsiFileList(@NotNull List inputFiles, + @NotNull Project project) { + List psiFiles = new ArrayList(); + for (String inputFile : inputFiles) { + psiFiles.add(JetFileUtils.loadPsiFile(inputFile, project)); + } + return psiFiles; + } } diff --git a/translator/test/org/jetbrains/k2js/test/TranslationTest.java b/translator/test/org/jetbrains/k2js/test/TranslationTest.java index 87032babce5..5d31c2abfec 100644 --- a/translator/test/org/jetbrains/k2js/test/TranslationTest.java +++ b/translator/test/org/jetbrains/k2js/test/TranslationTest.java @@ -81,7 +81,7 @@ public abstract class TranslationTest { } protected void translateFile(String filename) throws Exception { - (new K2JSTranslator()).testTranslateFile(getInputFilePath(filename), getOutputFilePath(filename)); + K2JSTranslator.testTranslateFile(getInputFilePath(filename), getOutputFilePath(filename)); } protected void translateFilesInDir(String dirName) throws Exception { @@ -92,7 +92,7 @@ public abstract class TranslationTest { fullFilePaths.add(getInputFilePath(dirName) + "\\" + fileName); } assert dir.isDirectory(); - (new K2JSTranslator()).testTranslateFiles(fullFilePaths, getOutputFilePath(dirName + ".kt")); + K2JSTranslator.testTranslateFiles(fullFilePaths, getOutputFilePath(dirName + ".kt")); } protected List generateFilenameList(String inputFile) {