From 4e80605b8b311223ec19345156534324a6a5e38c Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Thu, 8 Dec 2011 16:46:17 +0400 Subject: [PATCH] work on java.util.ArrayList --- .../translate/context/StandardClasses.java | 15 +++- .../translate/context/TranslationContext.java | 5 +- .../reference/ReferenceTranslator.java | 4 -- .../jetbrains/k2js/test/ArrayListTest.java | 21 ++++++ .../jetbrains/k2js/test/JavaClassesTest.java | 13 ++++ .../java/arrayList/cases/emptyList.kt | 8 +++ translator/testFiles/kotlin_lib.js | 69 ++++++++++++------- 7 files changed, 103 insertions(+), 32 deletions(-) create mode 100644 translator/test/org/jetbrains/k2js/test/ArrayListTest.java create mode 100644 translator/test/org/jetbrains/k2js/test/JavaClassesTest.java create mode 100644 translator/testFiles/java/arrayList/cases/emptyList.kt diff --git a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java index 0bd0fe66432..3daf13aeffa 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java +++ b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java @@ -28,12 +28,23 @@ public final class StandardClasses { bindArray(standardClasses, standardLibrary); ClassDescriptor iteratorClass = (ClassDescriptor) standardLibrary.getLibraryScope().getClassifier("Iterator"); + assert iteratorClass != null; bindIterator(standardClasses, iteratorClass); + + declareJavaArrayList(standardClasses); return standardClasses; } - private static void bindIterator(StandardClasses standardClasses, - ClassDescriptor iteratorClass) { + private static void declareJavaArrayList(@NotNull StandardClasses standardClasses) { + String arrayListFQName = "java.util.ArrayList"; + standardClasses.declareStandardTopLevelObject(arrayListFQName, "ArrayList"); + standardClasses.declareStandardMethodOrProperty(arrayListFQName, "size", "size"); + standardClasses.declareStandardMethodOrProperty(arrayListFQName, "", "ArrayList"); + } + + //TODO: more generic ways to declare standard classes + private static void bindIterator(@NotNull StandardClasses standardClasses, + @NotNull ClassDescriptor iteratorClass) { standardClasses.declareStandardTopLevelObject(iteratorClass, "ArrayIterator"); FunctionDescriptor nextFunction = getFunctionByName(iteratorClass.getDefaultType().getMemberScope(), "next"); diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index c1c403b4c1c..3a139a703af 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -101,7 +101,10 @@ public final class TranslationContext { if (dynamicContext.isDeclared(descriptor)) { return dynamicContext.getLocalName(descriptor); } - return staticContext.getGlobalName(descriptor); + if (staticContext.isDeclared(descriptor)) { + return staticContext.getGlobalName(descriptor); + } + throw new AssertionError("Undefined name in this scope: " + descriptor.getName()); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index 2414813221d..fb723582e5a 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -50,10 +50,6 @@ public class ReferenceTranslator extends AbstractTranslator { @NotNull public JsExpression translate() { - if (!context().isDeclared(referencedDescriptor)) { - throw new AssertionError("Undefined name in this scope: " + referencedDescriptor.getName()); - } - JsName referencedName = context().getNameForDescriptor(referencedDescriptor); JsExpression implicitReceiver = getImplicitReceiver(context(), referencedDescriptor); diff --git a/translator/test/org/jetbrains/k2js/test/ArrayListTest.java b/translator/test/org/jetbrains/k2js/test/ArrayListTest.java new file mode 100644 index 00000000000..11de105e70d --- /dev/null +++ b/translator/test/org/jetbrains/k2js/test/ArrayListTest.java @@ -0,0 +1,21 @@ +package org.jetbrains.k2js.test; + +import org.junit.Test; + +/** + * @author Talanov Pavel + */ +public final class ArrayListTest extends JavaClassesTest { + + final private static String MAIN = "arrayList/"; + + @Override + protected String mainDirectory() { + return MAIN; + } + + @Test + public void emptyList() throws Exception { + testFooBoxIsTrue("emptyList.kt"); + } +} diff --git a/translator/test/org/jetbrains/k2js/test/JavaClassesTest.java b/translator/test/org/jetbrains/k2js/test/JavaClassesTest.java new file mode 100644 index 00000000000..80b665f9a95 --- /dev/null +++ b/translator/test/org/jetbrains/k2js/test/JavaClassesTest.java @@ -0,0 +1,13 @@ +package org.jetbrains.k2js.test; + +/** + * @author Talanov Pavel + */ +public abstract class JavaClassesTest extends TranslationTest { + private final String SUITE = "java/"; + + @Override + protected String suiteDirectoryName() { + return SUITE; + } +} diff --git a/translator/testFiles/java/arrayList/cases/emptyList.kt b/translator/testFiles/java/arrayList/cases/emptyList.kt new file mode 100644 index 00000000000..988ceb2c2f2 --- /dev/null +++ b/translator/testFiles/java/arrayList/cases/emptyList.kt @@ -0,0 +1,8 @@ +namespace foo + +import java.util.ArrayList; + +fun box() : Boolean { + val a = ArrayList(); + return a.size == 0; +} \ No newline at end of file diff --git a/translator/testFiles/kotlin_lib.js b/translator/testFiles/kotlin_lib.js index cd38fba7d6d..b92c6af725f 100644 --- a/translator/testFiles/kotlin_lib.js +++ b/translator/testFiles/kotlin_lib.js @@ -46,7 +46,6 @@ var Class = (function () { parent.subclasses.push(klass); } - klass.addMethods( { get_class:function () { @@ -483,30 +482,50 @@ Kotlin.Array = Class.create({ } }); -//Kotlin.Array = Class.create({ -// initialize:function (len) { -// this.array = []; -// this.size = 0 -// }, -// get:function (index) { -// if ((index < 0) || (index > this.size)) { -// throw Kotlin.Exceptions.IndexOutOfBounds; -// } -// return (this.array)[index]; -// }, -// set:function (index, value) { -// if ((index < 0) || (index > this.size)) { -// throw Kotlin.Exceptions.IndexOutOfBounds; -// } -// (this.array)[index] = value; -// }, -// size:function () { -// return this.size; -// }, -// iterator:function () { -// return new Kotlin.ArrayIterator(this); -// } -//}); + +Kotlin.ArrayList = Class.create({ + initialize:function (len) { + this.array = []; + this.size = 0; + }, + get:function (index) { + if ((index < 0) || (index > this.size)) { + throw Kotlin.Exceptions.IndexOutOfBounds; + } + return (this.array)[index]; + }, + set:function (index, value) { + if ((index < 0) || (index > this.size)) { + throw Kotlin.Exceptions.IndexOutOfBounds; + } + (this.array)[index] = value; + }, + size:function () { + return this.size; + }, + iterator:function () { + return new Kotlin.ArrayIterator(this); + }, + isEmpty:function () { + return (this.size == 0); + }, + add:function (element) { + this.array[size++] = element; + }, + addAll:function (collection) { + var it = collection.iterator(); + while (it.hasNext()) { + this.add(it.next()); + } + }, + remove:function (index) { + for (var i = index; i < this.size - 1; ++i) { + this.array[i] = this.array[i + 1]; + } + this.size--; + } +}); + Kotlin.ArrayIterator = Class.create({ initialize:function (array) {