Array iterator object support.

This commit is contained in:
Pavel Talanov
2011-12-07 17:29:07 +04:00
parent 3019dc502f
commit 3cbb5b87fe
4 changed files with 33 additions and 4 deletions
@@ -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
@@ -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
@@ -44,5 +44,8 @@ public class StandardClassesTest extends TranslationTest {
testFooBoxIsTrue("arrayThrowsExceptionOnOOBaccess.kt");
}
@Test
public void arraysIterator() throws Exception {
testFooBoxIsTrue("arraysIterator.kt");
}
}
@@ -0,0 +1,11 @@
namespace foo
val a1 = Array<Int>(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));
}