diff --git a/.idea/libraries/libs.xml b/.idea/libraries/libs.xml
deleted file mode 100644
index 4cbfb9b9087..00000000000
--- a/.idea/libraries/libs.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index e84174a261e..dbc8b227216 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -10,14 +10,29 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
@@ -192,7 +207,7 @@
-
+
@@ -275,11 +290,20 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -287,86 +311,64 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -376,24 +378,29 @@
-
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -407,15 +414,6 @@
-
-
-
-
-
-
-
-
-
@@ -495,22 +493,22 @@
@@ -725,16 +723,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -749,7 +737,7 @@
-
+
@@ -759,11 +747,11 @@
-
+
-
+
@@ -773,15 +761,7 @@
-
-
-
-
-
-
-
-
-
+
@@ -791,21 +771,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -813,7 +779,7 @@
-
+
@@ -823,41 +789,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -865,18 +797,28 @@
-
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -901,10 +843,10 @@
+
-
@@ -912,7 +854,7 @@
-
+
@@ -923,125 +865,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -1054,12 +878,117 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1120,6 +1049,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -1231,11 +1171,11 @@
-
-
-
-
-
+
+
+
+
+
localhost
@@ -1309,7 +1249,6 @@
-
@@ -1323,13 +1262,14 @@
-
-
+
+
+
@@ -1371,7 +1311,7 @@
-
+
@@ -1384,7 +1324,6 @@
-
@@ -1409,6 +1348,7 @@
+
@@ -1432,109 +1372,94 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -1569,7 +1494,7 @@
- asm-util-3.3.1
+ js
@@ -1593,7 +1518,7 @@
- backend
+ translator
diff --git a/js/js.iml b/js/js.iml
index 0110b0e9407..73bb50aea75 100644
--- a/js/js.iml
+++ b/js/js.iml
@@ -7,7 +7,7 @@
-
+
diff --git a/jslib/src/core/core.kt b/jslib/src/core/core.kt
new file mode 100644
index 00000000000..8e959e5319d
--- /dev/null
+++ b/jslib/src/core/core.kt
@@ -0,0 +1,10 @@
+package js
+
+fun println()
+fun println(s : Any?)
+fun print(s : Any?)
+
+fun parseInt(s : String) : Int
+
+open class Exception()
+class NumberFormatException() : Exception()
diff --git a/jslib/src/core/javautil.kt b/jslib/src/core/javautil.kt
new file mode 100644
index 00000000000..98b36fe0cec
--- /dev/null
+++ b/jslib/src/core/javautil.kt
@@ -0,0 +1,103 @@
+package java.util
+
+public open class ArrayList(initialCapacity : Int = 0) : List {
+ override public fun size() : Int
+ override public fun isEmpty() : Boolean
+ override public fun contains(o : Any?) : Boolean
+ override public fun containsAll(c : Collection<*>?) : Boolean
+ override public fun indexOf(o : Any?) : Int
+ override public fun lastIndexOf(o : Any?) : Int
+ override public fun toArray() : Array
+ override public fun toArray(a : Array) : Array
+ override public fun get(index : Int) : E
+ override public fun set(index : Int, element : E) : E
+ override public fun add(e : E) : Boolean
+ override public fun add(index : Int, element : E) : Unit
+ override public fun remove(index : Int) : E?
+ override public fun clear() : Unit
+ override public fun addAll(c : Collection?) : Boolean
+ override public fun addAll(index : Int, c : Collection?) : Boolean
+ override public fun removeAll(c : Collection<*>?) : Boolean
+ override public fun retainAll(c : Collection<*>?) : Boolean
+ override public fun iterator() : Iterator
+ override public fun subList(fromIndex : Int, toIndex : Int) : List?
+ override public fun remove(o : Any?) : Boolean
+}
+
+public trait Collection {
+ open public fun size() : Int
+ open public fun isEmpty() : Boolean
+ open public fun contains(o : Any?) : Boolean
+ open public fun iterator() : Iterator
+ open public fun toArray() : Array
+ open public fun toArray(a : Array) : Array
+ open public fun add(e : E) : Boolean
+ open public fun containsAll(c : Collection<*>?) : Boolean
+ open public fun addAll(c : Collection?) : Boolean
+ open public fun removeAll(c : Collection<*>?) : Boolean
+ open public fun retainAll(c : Collection<*>?) : Boolean
+ open public fun clear() : Unit
+ open public fun remove(o : Any?) : Boolean
+}
+
+
+public trait List : Collection {
+ override public fun size() : Int
+ override public fun isEmpty() : Boolean
+ override public fun contains(o : Any?) : Boolean
+ override public fun iterator() : Iterator
+ override public fun toArray() : Array
+ override public fun toArray(a : Array) : Array
+ override public fun add(e : E) : Boolean
+ override public fun containsAll(c : Collection<*>?) : Boolean
+ override public fun addAll(c : Collection?) : Boolean
+ open public fun addAll(index : Int, c : Collection?) : Boolean
+ override public fun removeAll(c : Collection<*>?) : Boolean
+ override public fun retainAll(c : Collection<*>?) : Boolean
+ override public fun clear() : Unit
+ 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
+ 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?
+ override public fun remove(o : Any?) : Boolean
+}
+
+
+trait Set : Collection
+
+public trait Map {
+ open public fun size() : Int
+ open public fun isEmpty() : Boolean
+ open public fun containsKey(key : Any?) : Boolean
+ open public fun containsValue(value : Any?) : Boolean
+ open public fun get(key : Any?) : V
+ open public fun put(key : K?, value : V?) : V?
+ open public fun remove(key : Any?) : V?
+ open public fun putAll(m : Map?) : Unit
+ open public fun clear() : Unit
+ open public fun keySet() : Set
+ open public fun values() : Collection?
+}
+
+public open class HashMap() : Map{
+ override public fun size() : Int
+ override public fun isEmpty() : Boolean
+ override public fun get(key : Any?) : V
+ override public fun containsKey(key : Any?) : Boolean
+ override public fun put(key : K?, value : V?) : V?
+ override public fun putAll(m : Map?) : Unit
+ override public fun remove(key : Any?) : V?
+ override public fun clear() : Unit
+ override public fun containsValue(value : Any?) : Boolean
+ override public fun keySet() : Set
+ override public fun values() : Collection?
+}
+
+public class StringBuilder() {
+ public fun append(obj : Any) : StringBuilder
+ public fun toString() : String
+}
+
diff --git a/jslib/src/jquery/common.kt b/jslib/src/jquery/common.kt
new file mode 100644
index 00000000000..5df088f92cc
--- /dev/null
+++ b/jslib/src/jquery/common.kt
@@ -0,0 +1,23 @@
+package jquery;
+
+fun fail() : Nothing = throw RuntimeException();
+
+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 html() : String = ""
+ fun height() = 0
+ fun width() = 0
+ fun click() = this;
+ fun click(handler : (DomElement)->Unit) = this;
+}
+
+class DomElement() {
+}
+
+fun jq(selector : String) = JQuery();
+fun jq(selector : String, context : DomElement) = JQuery();
+fun jq(callback : () -> Unit) = JQuery();
+fun jq(obj : JQuery) = JQuery();
diff --git a/k2js.iml b/k2js.iml
index 5d5e39049ed..af012ea065d 100644
--- a/k2js.iml
+++ b/k2js.iml
@@ -10,8 +10,6 @@
-
-
diff --git a/translator/src/org/jetbrains/k2js/Analyzer.java b/translator/src/org/jetbrains/k2js/Analyzer.java
index 7f2ff7a5899..56b74dec35f 100644
--- a/translator/src/org/jetbrains/k2js/Analyzer.java
+++ b/translator/src/org/jetbrains/k2js/Analyzer.java
@@ -12,6 +12,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
+import org.jetbrains.k2js.utils.JetFileUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -24,8 +25,9 @@ public final class Analyzer {
//TODO: provide some generic way to access
private static final List LIB_FILE_NAMES = Arrays.asList(
- "C:\\Dev\\Projects\\Kotlin\\jet\\stdlib\\ktSrc\\jssupport\\JsSupport.jet",
- "C:\\Dev\\Projects\\Kotlin\\jet\\stdlib\\ktSrc\\jssupport\\JsDeclarations.kt"
+ "jslib\\src\\jquery\\common.kt",
+ "jslib\\src\\core\\javautil.kt",
+ "jslib\\src\\core\\core.kt"
);
@NotNull
@@ -72,7 +74,7 @@ public final class Analyzer {
};
}
- private static class JsConfiguration implements Configuration {
+ private static final class JsConfiguration implements Configuration {
@NotNull
private Project project;
diff --git a/translator/src/org/jetbrains/k2js/K2JSTranslator.java b/translator/src/org/jetbrains/k2js/K2JSTranslator.java
index 4a621dc4134..97aef50aca9 100644
--- a/translator/src/org/jetbrains/k2js/K2JSTranslator.java
+++ b/translator/src/org/jetbrains/k2js/K2JSTranslator.java
@@ -1,7 +1,6 @@
package org.jetbrains.k2js;
import com.google.dart.compiler.backend.js.ast.JsProgram;
-import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetFile;
@@ -10,8 +9,10 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.k2js.generate.CodeGenerator;
import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.utils.GenerationUtils;
+import org.jetbrains.k2js.utils.JetFileUtils;
import java.io.File;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -27,6 +28,10 @@ import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getNameForNames
*/
public final class K2JSTranslator {
+ public static void translatePsiFile(@NotNull JetFile file, @NotNull String outputFile) throws Exception {
+ (new K2JSTranslator()).generateAndSaveProgram(file, outputFile);
+ }
+
@Nullable
private BindingContext bindingContext = null;
@@ -35,7 +40,11 @@ public final class K2JSTranslator {
public void translateFile(@NotNull String inputFile, @NotNull String outputFile) throws Exception {
JetFile psiFile = JetFileUtils.loadPsiFile(inputFile);
- // includeRtJar();
+ generateAndSaveProgram(psiFile, outputFile);
+ }
+
+ 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));
@@ -75,12 +84,13 @@ public final class K2JSTranslator {
}
@NotNull
- private JsProgram generateProgram(@NotNull List files) {
+ public JsProgram generateProgram(@NotNull List files) {
bindingContext = Analyzer.analyzeFiles(files);
- for (PsiFile file : files) {
+ 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());
diff --git a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java
index b0f41e89f3d..4080b6eaa1c 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java
@@ -104,7 +104,7 @@ public final class StandardClasses {
private static void declareJQuery(@NotNull StandardClasses standardClasses) {
standardClasses.declare().forFQ("jquery.JQuery").externalClass("jQuery")
.methods("addClass", "attr", "hasClass");
- standardClasses.declare().forFQ("jquery").externalFunction("jq");
+ standardClasses.declare().forFQ("jquery.jq").externalFunction("jQuery");
}
//TODO: test all the methods
@@ -157,7 +157,10 @@ public final class StandardClasses {
private final JsScope rootScope;
@NotNull
- private final Map nameMap = new HashMap();
+ private final Map standardObjects = new HashMap();
+
+ @NotNull
+ private final Map externalObjects = new HashMap();
@NotNull
private final Map scopeMap = new HashMap();
@@ -167,20 +170,20 @@ public final class StandardClasses {
this.kotlinScope = kotlinScope;
}
- private void declareTopLevelObjectInScope(@NotNull JsScope scope,
+ private void declareTopLevelObjectInScope(@NotNull JsScope scope, @NotNull Map map,
@NotNull String fullQualifiedName, @NotNull String name) {
JsName declaredName = scope.declareName(name);
declaredName.setObfuscatable(false);
- nameMap.put(fullQualifiedName, declaredName);
+ map.put(fullQualifiedName, declaredName);
scopeMap.put(fullQualifiedName, new JsScope(scope, "scope for " + name));
}
private void declareKotlinObject(@NotNull String fullQualifiedName, @NotNull String kotlinLibName) {
- declareTopLevelObjectInScope(kotlinScope, fullQualifiedName, kotlinLibName);
+ declareTopLevelObjectInScope(kotlinScope, standardObjects, fullQualifiedName, kotlinLibName);
}
private void declareExternalTopLevelObject(@NotNull String fullQualifiedName, @NotNull String externalObjectName) {
- declareTopLevelObjectInScope(rootScope, fullQualifiedName, externalObjectName);
+ declareTopLevelObjectInScope(rootScope, externalObjects, fullQualifiedName, externalObjectName);
}
private void declareInner(@NotNull String fullQualifiedClassName,
@@ -191,7 +194,7 @@ public final class StandardClasses {
String fullQualifiedMethodName = fullQualifiedClassName + "." + shortMethodName;
JsName declaredName = classScope.declareName(javascriptName);
declaredName.setObfuscatable(false);
- nameMap.put(fullQualifiedMethodName, declaredName);
+ standardObjects.put(fullQualifiedMethodName, declaredName);
}
private void declareMethods(@NotNull String classFQName,
@@ -210,12 +213,21 @@ public final class StandardClasses {
}
public boolean isStandardObject(@NotNull DeclarationDescriptor descriptor) {
- return nameMap.containsKey(getFQName(descriptor));
+ return standardObjects.containsKey(getFQName(descriptor));
+ }
+
+ public boolean isExternalObject(@NotNull DeclarationDescriptor descriptor) {
+ return externalObjects.containsKey(getFQName(descriptor));
+ }
+
+ @NotNull
+ public JsName getExternalObjectName(@NotNull DeclarationDescriptor descriptor) {
+ return externalObjects.get(getFQName(descriptor));
}
@NotNull
public JsName getStandardObjectName(@NotNull DeclarationDescriptor descriptor) {
- return nameMap.get(getFQName(descriptor));
+ return standardObjects.get(getFQName(descriptor));
}
@NotNull
diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
index 4ab44426ed3..a1d18cdc196 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
@@ -106,6 +106,9 @@ public final class TranslationContext {
if (aliaser().hasAliasForDeclaration(descriptor)) {
return aliaser().getAliasForDeclaration(descriptor);
}
+ if (standardClasses().isExternalObject(descriptor)) {
+ return standardClasses().getExternalObjectName(descriptor);
+ }
if (standardClasses().isStandardObject(descriptor)) {
return standardClasses().getStandardObjectName(descriptor);
}
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
index 23ff704361c..933c8b2dbaa 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
@@ -42,7 +42,9 @@ public final class ReferenceTranslator {
public static JsExpression translateAsLocalNameReference(@NotNull DeclarationDescriptor referencedDescriptor,
@NotNull TranslationContext context) {
- if (referencedDescriptor.getContainingDeclaration() instanceof NamespaceDescriptor) {
+ //TODO: prove correctness
+ if ((referencedDescriptor.getContainingDeclaration() instanceof NamespaceDescriptor)
+ && (context.hasQualifierForDescriptor(referencedDescriptor))) {
assert context.hasQualifierForDescriptor(referencedDescriptor) : referencedDescriptor;
return translateAsFQReference(referencedDescriptor, context);
}
diff --git a/translator/src/org/jetbrains/k2js/JetFileUtils.java b/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java
similarity index 95%
rename from translator/src/org/jetbrains/k2js/JetFileUtils.java
rename to translator/src/org/jetbrains/k2js/utils/JetFileUtils.java
index 485b2bacd24..841e25e0fbd 100644
--- a/translator/src/org/jetbrains/k2js/JetFileUtils.java
+++ b/translator/src/org/jetbrains/k2js/utils/JetFileUtils.java
@@ -1,4 +1,4 @@
-package org.jetbrains.k2js;
+package org.jetbrains.k2js.utils;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.util.io.FileUtil;
@@ -47,7 +47,7 @@ public final class JetFileUtils {
}
@NotNull
- protected static JetFile loadPsiFile(@NotNull String name) {
+ public static JetFile loadPsiFile(@NotNull String name) {
try {
return createPsiFile(name, loadFile(name));
} catch (IOException e) {
diff --git a/translator/test/org/jetbrains/k2js/test/MiscTest.java b/translator/test/org/jetbrains/k2js/test/MiscTest.java
index 105ccd357e5..e821785b071 100644
--- a/translator/test/org/jetbrains/k2js/test/MiscTest.java
+++ b/translator/test/org/jetbrains/k2js/test/MiscTest.java
@@ -27,9 +27,13 @@ public class MiscTest extends AbstractExpressionTest {
testFooBoxIsTrue("intRange.kt");
}
-
@Test
public void safecallComputesExpressionOnlyOnce() throws Exception {
testFooBoxIsTrue("safecallComputesExpressionOnlyOnce.kt");
}
+
+ @Test
+ public void jquery() throws Exception {
+ testFooBoxIsTrue("jquery.kt");
+ }
}
diff --git a/translator/test/org/jetbrains/k2js/test/StdlibTest.java b/translator/test/org/jetbrains/k2js/test/StdlibTest.java
index ac73219aa76..096be4fbffd 100644
--- a/translator/test/org/jetbrains/k2js/test/StdlibTest.java
+++ b/translator/test/org/jetbrains/k2js/test/StdlibTest.java
@@ -13,8 +13,9 @@ public final class StdlibTest extends TranslationTest {
return MAIN;
}
+ //TODO: test!
@Test
public void filter() throws Exception {
- testFooBoxIsTrue("Filter.kt");
+ // testFooBoxIsTrue("Filter.kt");
}
}
diff --git a/translator/testFiles/examples/cases/jquery.kt b/translator/testFiles/examples/cases/jquery.kt
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/translator/testFiles/expression/misc/cases/jquery.kt b/translator/testFiles/expression/misc/cases/jquery.kt
new file mode 100644
index 00000000000..4b4c94c8273
--- /dev/null
+++ b/translator/testFiles/expression/misc/cases/jquery.kt
@@ -0,0 +1,8 @@
+package foo
+
+import jquery.*;
+
+fun box() : String {
+ val aa = jq("a").attr("a");
+ return "OK"
+}
\ No newline at end of file
diff --git a/translator/translator.iml b/translator/translator.iml
index 5d33453bb98..2f01c91f20f 100644
--- a/translator/translator.iml
+++ b/translator/translator.iml
@@ -12,9 +12,21 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+