From 3cbb5b87feb4c9c770d98657fbc0f9e985f2f794 Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Wed, 7 Dec 2011 17:29:07 +0400 Subject: [PATCH] Array iterator object support. --- .../k2js/translate/context/Aliaser.java | 19 +++++++++++++++++-- .../k2js/translate/context/Namer.java | 2 +- .../k2js/test/StandardClassesTest.java | 5 ++++- .../standardClasses/cases/arraysIterator.kt | 11 +++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 translator/testFiles/standardClasses/cases/arraysIterator.kt diff --git a/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java index 2e0600e0a1f..816d674bbe8 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java +++ b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java @@ -4,6 +4,7 @@ import com.google.dart.compiler.backend.js.ast.JsName; import com.google.dart.compiler.backend.js.ast.JsNameRef; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; @@ -18,16 +19,30 @@ import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getPropertyByNa //TODO: implement aliases stack for this public class Aliaser { - static public Aliaser aliasesForStandardClasses(@NotNull JetStandardLibrary standardLibrary, + public static Aliaser aliasesForStandardClasses(@NotNull JetStandardLibrary standardLibrary, @NotNull Namer namer) { Aliaser aliaser = new Aliaser(); + setAliasesForArray(standardLibrary, namer, aliaser); + ClassDescriptor iteratorClass = (ClassDescriptor) + standardLibrary.getLibraryScope().getClassifier("Iterator"); + setAliasesForIterator(namer, aliaser, iteratorClass); + return aliaser; + } + + private static void setAliasesForIterator(Namer namer, Aliaser aliaser, ClassDescriptor iteratorClass) { + FunctionDescriptor nextFunction = getFunctionByName(iteratorClass.getDefaultType().getMemberScope(), "next"); + PropertyDescriptor hasNextProperty = getPropertyByName(iteratorClass.getDefaultType().getMemberScope(), "hasNext"); + aliaser.setAliasForDescriptor(nextFunction, namer.libraryMethod("next")); + aliaser.setAliasForDescriptor(hasNextProperty, namer.libraryMethod("hasNext")); + } + + private static void setAliasesForArray(JetStandardLibrary standardLibrary, Namer namer, Aliaser aliaser) { aliaser.setAliasForDescriptor(standardLibrary.getArray(), namer.libraryObject("Array")); FunctionDescriptor nullConstructorFunction = getFunctionByName(standardLibrary.getLibraryScope(), "Array"); aliaser.setAliasForDescriptor(nullConstructorFunction, namer.libraryObject("array")); PropertyDescriptor sizeProperty = getPropertyByName(standardLibrary.getArray().getDefaultType().getMemberScope(), "size"); aliaser.setAliasForDescriptor(sizeProperty, namer.libraryMethod("size")); - return aliaser; } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/context/Namer.java b/translator/src/org/jetbrains/k2js/translate/context/Namer.java index 6ef03ea9898..a98566bec15 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/Namer.java +++ b/translator/src/org/jetbrains/k2js/translate/context/Namer.java @@ -132,7 +132,7 @@ public final class Namer { @NotNull public JsName libraryMethod(@NotNull String name) { //TODO: Create scopes for library methods - return kotlinScope.declareName("size"); + return kotlinScope.declareName(name); } @NotNull diff --git a/translator/test/org/jetbrains/k2js/test/StandardClassesTest.java b/translator/test/org/jetbrains/k2js/test/StandardClassesTest.java index 5a5a0522930..b1b3c8eb1a8 100644 --- a/translator/test/org/jetbrains/k2js/test/StandardClassesTest.java +++ b/translator/test/org/jetbrains/k2js/test/StandardClassesTest.java @@ -44,5 +44,8 @@ public class StandardClassesTest extends TranslationTest { testFooBoxIsTrue("arrayThrowsExceptionOnOOBaccess.kt"); } - + @Test + public void arraysIterator() throws Exception { + testFooBoxIsTrue("arraysIterator.kt"); + } } diff --git a/translator/testFiles/standardClasses/cases/arraysIterator.kt b/translator/testFiles/standardClasses/cases/arraysIterator.kt new file mode 100644 index 00000000000..9ff140a091c --- /dev/null +++ b/translator/testFiles/standardClasses/cases/arraysIterator.kt @@ -0,0 +1,11 @@ +namespace foo + +val a1 = Array(3, {(i : Int) => i}) + +fun box() : Boolean{ + val i = a1.iterator() + return ((i.hasNext == true) && (i.next() == 0) && + (i.hasNext == true) && (i.next() == 1) && + (i.hasNext == true) && (i.next() == 2) && + (i.hasNext == false)); +} \ No newline at end of file