diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index c40c88c5864..84831b741b3 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,8 +5,18 @@
+
+
+
+
+
+
+
+
+
+
@@ -200,58 +210,69 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -266,8 +287,8 @@
-
-
+
+
@@ -275,52 +296,23 @@
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
@@ -328,10 +320,19 @@
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
@@ -385,7 +386,7 @@
-
+
@@ -393,6 +394,15 @@
+
+
+
+
+
+
+
+
+
@@ -414,22 +424,22 @@
@@ -831,29 +841,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -989,6 +976,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1116,11 +1136,11 @@
-
-
-
-
-
+
+
+
+
+
localhost
@@ -1193,9 +1213,9 @@
-
+
-
+
@@ -1239,7 +1259,7 @@
-
+
@@ -1252,7 +1272,6 @@
-
@@ -1277,6 +1296,7 @@
+
@@ -1286,27 +1306,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1314,6 +1313,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1321,50 +1336,34 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1372,32 +1371,53 @@
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
diff --git a/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
index 2b1077291a4..eac696cbbb5 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
@@ -6,12 +6,14 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
+import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.types.JetStandardLibrary;
import java.util.HashMap;
import java.util.Map;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getFunctionByName;
+import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getPropertyByName;
//TODO: implement aliases stack for this
public class Aliaser {
@@ -22,6 +24,9 @@ public class 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;
}
@@ -39,6 +44,7 @@ public class Aliaser {
return aliasForThis.makeRef();
}
+ @SuppressWarnings("NullableProblems")
public void setAliasForThis(@NotNull JsName alias) {
aliasForThis = alias;
}
diff --git a/translator/src/org/jetbrains/k2js/translate/context/Namer.java b/translator/src/org/jetbrains/k2js/translate/context/Namer.java
index dcb1640d57d..6ef03ea9898 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/Namer.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/Namer.java
@@ -130,13 +130,14 @@ public final class Namer {
}
@NotNull
- public JsNameRef kotlinObject() {
- return kotlinName.makeRef();
+ public JsName libraryMethod(@NotNull String name) {
+ //TODO: Create scopes for library methods
+ return kotlinScope.declareName("size");
}
@NotNull
- public JsName declareStandardClass(@NotNull String name) {
- return kotlinScope.declareName(name);
+ public JsNameRef kotlinObject() {
+ return kotlinName.makeRef();
}
@NotNull
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java
index f3379dce177..6e4f93206de 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java
@@ -11,6 +11,7 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic;
+import org.jetbrains.k2js.translate.utils.DescriptorUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
import java.util.Arrays;
@@ -19,6 +20,7 @@ import java.util.List;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForCallExpression;
+import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getVariableDescriptorForVariableAsFunction;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.isConstructorDescriptor;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.*;
@@ -122,19 +124,23 @@ public final class CallTranslator extends AbstractTranslator {
@NotNull
private JsExpression calleeReference() {
- //TODO: refactor
- //TODO: write tests on this cases
- if (functionDescriptor instanceof VariableAsFunctionDescriptor) {
- VariableDescriptor variableDescriptor = ((VariableAsFunctionDescriptor) functionDescriptor).getVariableDescriptor();
+ if (DescriptorUtils.isVariableDescriptor(functionDescriptor)) {
+ //TODO: write tests on this cases
+ VariableDescriptor variableDescriptor =
+ getVariableDescriptorForVariableAsFunction((VariableAsFunctionDescriptor) functionDescriptor);
if (variableDescriptor instanceof PropertyDescriptor) {
- PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor;
- return PropertyAccessTranslator.translateAsPropertyGetterCall(propertyDescriptor, context());
+ return getterCall((PropertyDescriptor) variableDescriptor);
}
return qualifiedMethodReference(variableDescriptor);
}
return qualifiedMethodReference(functionDescriptor);
}
+ @NotNull
+ private JsExpression getterCall(PropertyDescriptor variableDescriptor) {
+ return PropertyAccessTranslator.translateAsPropertyGetterCall(variableDescriptor, context());
+ }
+
@NotNull
private JsExpression qualifiedMethodReference(@NotNull DeclarationDescriptor descriptor) {
JsExpression methodReference = ReferenceTranslator.translateReference(descriptor, context());
@@ -146,7 +152,7 @@ public final class CallTranslator extends AbstractTranslator {
@NotNull
private JsExpression constructorCall() {
- JsNew constructorCall = new JsNew(calleeReference());
+ JsNew constructorCall = new JsNew(qualifiedMethodReference(functionDescriptor));
constructorCall.setArguments(arguments);
return constructorCall;
}
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
index 47a4b0aea9a..981403526c8 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
@@ -219,7 +219,7 @@ public final class PropertyAccessTranslator extends AccessTranslator {
@NotNull
private PropertyGetterDescriptor getGetterDescriptor() {
PropertyGetterDescriptor getter = propertyDescriptor.getGetter();
- assert getter != null;
+ assert getter != null : propertyDescriptor.getName() + " does not have a getter.";
return getter;
}
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
index 6e2be99b2d5..b3bd3ffd0cb 100644
--- a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
+++ b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
@@ -15,6 +15,7 @@ import java.util.Collection;
import java.util.List;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getVariableDescriptorForVariableAsFunction;
+import static org.jetbrains.k2js.translate.utils.DescriptorUtils.isVariableDescriptor;
/**
* @author Talanov Pavel
@@ -157,7 +158,8 @@ public final class BindingUtils {
private static DeclarationDescriptor getNullableDescriptorForReferenceExpression(@NotNull BindingContext context,
@NotNull JetReferenceExpression reference) {
DeclarationDescriptor referencedDescriptor = context.get(BindingContext.REFERENCE_TARGET, reference);
- if (referencedDescriptor instanceof VariableAsFunctionDescriptor) {
+ if (isVariableDescriptor(referencedDescriptor)) {
+ assert referencedDescriptor != null;
return getVariableDescriptorForVariableAsFunction((VariableAsFunctionDescriptor) referencedDescriptor);
}
return referencedDescriptor;
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java
index be9bb81ca04..8d0a375da82 100644
--- a/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java
+++ b/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java
@@ -80,6 +80,14 @@ public final class DescriptorUtils {
+ " supposed to be exactly one " + name + " function.");
}
+ @NotNull
+ public static PropertyDescriptor getPropertyByName(@NotNull JetScope scope,
+ @NotNull String name) {
+ PropertyDescriptor descriptor = (PropertyDescriptor) scope.getVariable(name);
+ assert descriptor != null : "Must have a descriptor.";
+ return descriptor;
+ }
+
@Nullable
public static ClassDescriptor findAncestorClass(@NotNull List superclassDescriptors) {
for (ClassDescriptor descriptor : superclassDescriptors) {
@@ -91,10 +99,15 @@ public final class DescriptorUtils {
}
@NotNull
- /*package*/ static VariableDescriptor getVariableDescriptorForVariableAsFunction
+ public static VariableDescriptor getVariableDescriptorForVariableAsFunction
(@NotNull VariableAsFunctionDescriptor descriptor) {
VariableDescriptor functionVariable = descriptor.getVariableDescriptor();
assert functionVariable != null;
return functionVariable;
}
+
+
+ public static boolean isVariableDescriptor(@Nullable DeclarationDescriptor referencedDescriptor) {
+ return referencedDescriptor instanceof VariableAsFunctionDescriptor;
+ }
}
diff --git a/translator/test/org/jetbrains/k2js/test/StandardClassesTest.java b/translator/test/org/jetbrains/k2js/test/StandardClassesTest.java
index 0a1f87203c6..3a6292cdf90 100644
--- a/translator/test/org/jetbrains/k2js/test/StandardClassesTest.java
+++ b/translator/test/org/jetbrains/k2js/test/StandardClassesTest.java
@@ -22,4 +22,19 @@ public class StandardClassesTest extends TranslationTest {
public void arrayAccess() throws Exception {
testFooBoxIsTrue("arrayAccess.kt");
}
+
+ @Test
+ public void arrayIsFilledWithNulls() throws Exception {
+ testFooBoxIsTrue("arrayIsFilledWithNulls.kt");
+ }
+
+ @Test
+ public void arrayFunctionConstructor() throws Exception {
+ testFooBoxIsTrue("arrayFunctionConstructor.kt");
+ }
+
+ @Test
+ public void arraySize() throws Exception {
+ testFooBoxIsTrue("arraySize.kt");
+ }
}
diff --git a/translator/testFiles/kotlin_lib.js b/translator/testFiles/kotlin_lib.js
index 5f12c89782e..189a7a2ad86 100644
--- a/translator/testFiles/kotlin_lib.js
+++ b/translator/testFiles/kotlin_lib.js
@@ -474,10 +474,13 @@ Kotlin.Array = Class.create({
throw Kotlin.Exceptions.IndexOutOfBounds;
}
(this.array)[index] = value;
+ },
+ size:function () {
+ return this.array.length;
}
});
-Kotlin.Class = Class
-Kotlin.Namespace = Namespace
-Kotlin.Trait = Trait
-Kotlin.isType = isType
+Kotlin.Class = Class;
+Kotlin.Namespace = Namespace;
+Kotlin.Trait = Trait;
+Kotlin.isType = isType;
diff --git a/translator/testFiles/standardClasses/cases/arrayFunctionConstructor.kt b/translator/testFiles/standardClasses/cases/arrayFunctionConstructor.kt
new file mode 100644
index 00000000000..311aa84d118
--- /dev/null
+++ b/translator/testFiles/standardClasses/cases/arrayFunctionConstructor.kt
@@ -0,0 +1,7 @@
+namespace foo
+
+val f = {(i : Int) => i + 1}
+
+val a = Array(3, f)
+
+fun box() = (a[0] == 1 && a[2] == 3 && a[1] == 2)
\ No newline at end of file
diff --git a/translator/testFiles/standardClasses/cases/arrayIsFilledWithNulls.kt b/translator/testFiles/standardClasses/cases/arrayIsFilledWithNulls.kt
new file mode 100644
index 00000000000..24b642b0f29
--- /dev/null
+++ b/translator/testFiles/standardClasses/cases/arrayIsFilledWithNulls.kt
@@ -0,0 +1,5 @@
+namespace foo
+
+val a = Array(3)
+
+fun box() = (a[0] == null && a[1] == null && a[2] == null)
\ No newline at end of file
diff --git a/translator/testFiles/standardClasses/cases/arraySize.kt b/translator/testFiles/standardClasses/cases/arraySize.kt
new file mode 100644
index 00000000000..2aea4ca6712
--- /dev/null
+++ b/translator/testFiles/standardClasses/cases/arraySize.kt
@@ -0,0 +1,8 @@
+namespace foo
+
+class A() {}
+
+val a1 = Array(3)
+val a2 = Array(2)
+
+fun box() = (a1.size == 3 && a2.size == 2)
\ No newline at end of file