diff --git a/js/js.libraries/src/core/kotlin.kt b/js/js.libraries/src/core/kotlin.kt index 5280fa8d75e..ab661372076 100644 --- a/js/js.libraries/src/core/kotlin.kt +++ b/js/js.libraries/src/core/kotlin.kt @@ -5,31 +5,22 @@ import java.util.* library("comparator") public fun comparator(f : (T, T) -> Int): Comparator = js.noImpl -library("array") public fun array(vararg value: T): Array = js.noImpl // "constructors" for primitive types array -library("array") public fun doubleArray(vararg content : Double): DoubleArray = js.noImpl -library("array") public fun floatArray(vararg content : Float): FloatArray = js.noImpl -library("array") public fun longArray(vararg content : Long): LongArray = js.noImpl -library("array") public fun intArray(vararg content : Int): IntArray = js.noImpl -library("array") public fun charArray(vararg content : Char): CharArray = js.noImpl -library("array") public fun shortArray(vararg content : Short): ShortArray = js.noImpl -library("array") public fun byteArray(vararg content : Byte): ByteArray = js.noImpl -library("array") public fun booleanArray(vararg content : Boolean): BooleanArray = js.noImpl diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/ArrayFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/ArrayFIF.java index efc8f417a9e..600862be1d3 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/ArrayFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/ArrayFIF.java @@ -22,13 +22,19 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; 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.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.lang.PrimitiveType; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.basic.CallStandardMethodIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; +import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate; import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate; +import org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder; import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.List; @@ -51,6 +57,7 @@ public final class ArrayFIF extends CompositeFIF { @NotNull private static final NamePredicate ARRAYS; + static { List arrayTypeNames = Lists.newArrayList(); for (PrimitiveType type : PrimitiveType.NUMBER_TYPES) { @@ -74,6 +81,19 @@ public final class ArrayFIF extends CompositeFIF { ARRAYS = new NamePredicate(arrayTypeNames); } + private static final FunctionIntrinsic ARRAY_INTRINSIC = new FunctionIntrinsic() { + @NotNull + @Override + public JsExpression apply( + @Nullable JsExpression receiver, + @NotNull List arguments, + @NotNull TranslationContext context + ) { + assert arguments.size() == 1; + return arguments.get(0); + } + }; + @NotNull private static final FunctionIntrinsic GET_INTRINSIC = new FunctionIntrinsic() { @NotNull @@ -120,5 +140,22 @@ public final class ArrayFIF extends CompositeFIF { add(pattern(NUMBER_ARRAY, ""), new CallStandardMethodIntrinsic(new JsNameRef("numberArrayOfSize", "Kotlin"), false, 1)); add(pattern(CHAR_ARRAY, ""), new CallStandardMethodIntrinsic(new JsNameRef("charArrayOfSize", "Kotlin"), false, 1)); add(pattern(BOOLEAN_ARRAY, ""), new CallStandardMethodIntrinsic(new JsNameRef("booleanArrayOfSize", "Kotlin"), false, 1)); + add(PatternBuilder.create("kotlin", "array"), ARRAY_INTRINSIC); + add(new DescriptorPredicate() { + @Override + public boolean apply(@Nullable FunctionDescriptor descriptor) { + if (descriptor == null) { + return false; + } + + for (PrimitiveType type : PrimitiveType.values()) { + if (type.getArrayTypeName().equals(descriptor.getName())) { + DeclarationDescriptor nsDeclaration = descriptor.getContainingDeclaration(); + return nsDeclaration instanceof NamespaceDescriptor && DescriptorUtils.isRootNamespace((NamespaceDescriptor) nsDeclaration) && nsDeclaration.getName().asString().equals("kotlin"); + } + } + return false; + } + }, ARRAY_INTRINSIC); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java index f7f7668860f..588cf939126 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -34,7 +34,7 @@ public final class TopLevelFIF extends CompositeFIF { @NotNull public static final CallStandardMethodIntrinsic EQUALS = new CallStandardMethodIntrinsic(new JsNameRef("equals", "Kotlin"), true, 1); @NotNull - public static final FunctionIntrinsic RETURN_RECEIVER_INTRINSIC = new FunctionIntrinsic() { + private static final FunctionIntrinsic RETURN_RECEIVER_INTRINSIC = new FunctionIntrinsic() { @NotNull @Override public JsExpression apply( diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/PatternBuilder.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/PatternBuilder.java index f6ecd1218cd..9485872d020 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/PatternBuilder.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/PatternBuilder.java @@ -19,7 +19,9 @@ package org.jetbrains.k2js.translate.intrinsic.functions.patterns; import com.google.common.collect.Lists; 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.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.name.Name; @@ -108,4 +110,34 @@ public final class PatternBuilder { public static DescriptorPredicate pattern(@NotNull NamePredicate... checkers) { return pattern(Arrays.asList(checkers)); } + + @NotNull + public static DescriptorPredicate create(@NotNull final String... names) { + return new DescriptorPredicate() { + @Override + public boolean apply(@Nullable FunctionDescriptor functionDescriptor) { + if (functionDescriptor == null) { + return false; + } + + DeclarationDescriptor descriptor = functionDescriptor; + int nameIndex = names.length - 1; + do { + if (!descriptor.getName().asString().equals(names[nameIndex--])) { + return false; + } + descriptor = descriptor.getContainingDeclaration(); + if (nameIndex == -1) { + return isRootNamespace(descriptor); + } + } + while (descriptor != null && !isRootNamespace(descriptor)); + return false; + } + }; + } + + private static boolean isRootNamespace(DeclarationDescriptor declarationDescriptor) { + return declarationDescriptor instanceof NamespaceDescriptor && DescriptorUtils.isRootNamespace((NamespaceDescriptor) declarationDescriptor); + } } diff --git a/js/js.translator/testFiles/kotlin_lib.js b/js/js.translator/testFiles/kotlin_lib.js index 4f4db25f764..2a4ebda109b 100644 --- a/js/js.translator/testFiles/kotlin_lib.js +++ b/js/js.translator/testFiles/kotlin_lib.js @@ -59,10 +59,6 @@ var kotlin = {set:function (receiver, key, value) { return obj1 === obj2; }; - Kotlin.array = function (args) { - return args === null || args === undefined ? [] : args.slice(); - }; - Kotlin.intUpto = function (from, to) { return Kotlin.$new(Kotlin.NumberRange)(from, to); };