JS backend: make intrinsic array factory methods.
#KT-2511 fixed (cherry picked from commit 31843c5)
This commit is contained in:
@@ -5,31 +5,22 @@ import java.util.*
|
|||||||
library("comparator")
|
library("comparator")
|
||||||
public fun comparator<T>(f : (T, T) -> Int): Comparator<T> = js.noImpl
|
public fun comparator<T>(f : (T, T) -> Int): Comparator<T> = js.noImpl
|
||||||
|
|
||||||
library("array")
|
|
||||||
public fun <T> array(vararg value: T): Array<T> = js.noImpl
|
public fun <T> array(vararg value: T): Array<T> = js.noImpl
|
||||||
|
|
||||||
// "constructors" for primitive types array
|
// "constructors" for primitive types array
|
||||||
library("array")
|
|
||||||
public fun doubleArray(vararg content : Double): DoubleArray = js.noImpl
|
public fun doubleArray(vararg content : Double): DoubleArray = js.noImpl
|
||||||
|
|
||||||
library("array")
|
|
||||||
public fun floatArray(vararg content : Float): FloatArray = js.noImpl
|
public fun floatArray(vararg content : Float): FloatArray = js.noImpl
|
||||||
|
|
||||||
library("array")
|
|
||||||
public fun longArray(vararg content : Long): LongArray = js.noImpl
|
public fun longArray(vararg content : Long): LongArray = js.noImpl
|
||||||
|
|
||||||
library("array")
|
|
||||||
public fun intArray(vararg content : Int): IntArray = js.noImpl
|
public fun intArray(vararg content : Int): IntArray = js.noImpl
|
||||||
|
|
||||||
library("array")
|
|
||||||
public fun charArray(vararg content : Char): CharArray = js.noImpl
|
public fun charArray(vararg content : Char): CharArray = js.noImpl
|
||||||
|
|
||||||
library("array")
|
|
||||||
public fun shortArray(vararg content : Short): ShortArray = js.noImpl
|
public fun shortArray(vararg content : Short): ShortArray = js.noImpl
|
||||||
|
|
||||||
library("array")
|
|
||||||
public fun byteArray(vararg content : Byte): ByteArray = js.noImpl
|
public fun byteArray(vararg content : Byte): ByteArray = js.noImpl
|
||||||
|
|
||||||
library("array")
|
|
||||||
public fun booleanArray(vararg content : Boolean): BooleanArray = js.noImpl
|
public fun booleanArray(vararg content : Boolean): BooleanArray = js.noImpl
|
||||||
|
|
||||||
|
|||||||
+37
@@ -22,13 +22,19 @@ import com.google.dart.compiler.backend.js.ast.JsExpression;
|
|||||||
import com.google.dart.compiler.backend.js.ast.JsNameRef;
|
import com.google.dart.compiler.backend.js.ast.JsNameRef;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
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.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
|
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic;
|
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.CallStandardMethodIntrinsic;
|
||||||
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
|
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.NamePredicate;
|
||||||
|
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder;
|
||||||
import org.jetbrains.k2js.translate.utils.JsAstUtils;
|
import org.jetbrains.k2js.translate.utils.JsAstUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -51,6 +57,7 @@ public final class ArrayFIF extends CompositeFIF {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static final NamePredicate ARRAYS;
|
private static final NamePredicate ARRAYS;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
List<Name> arrayTypeNames = Lists.newArrayList();
|
List<Name> arrayTypeNames = Lists.newArrayList();
|
||||||
for (PrimitiveType type : PrimitiveType.NUMBER_TYPES) {
|
for (PrimitiveType type : PrimitiveType.NUMBER_TYPES) {
|
||||||
@@ -74,6 +81,19 @@ public final class ArrayFIF extends CompositeFIF {
|
|||||||
ARRAYS = new NamePredicate(arrayTypeNames);
|
ARRAYS = new NamePredicate(arrayTypeNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final FunctionIntrinsic ARRAY_INTRINSIC = new FunctionIntrinsic() {
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public JsExpression apply(
|
||||||
|
@Nullable JsExpression receiver,
|
||||||
|
@NotNull List<JsExpression> arguments,
|
||||||
|
@NotNull TranslationContext context
|
||||||
|
) {
|
||||||
|
assert arguments.size() == 1;
|
||||||
|
return arguments.get(0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static final FunctionIntrinsic GET_INTRINSIC = new FunctionIntrinsic() {
|
private static final FunctionIntrinsic GET_INTRINSIC = new FunctionIntrinsic() {
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -120,5 +140,22 @@ public final class ArrayFIF extends CompositeFIF {
|
|||||||
add(pattern(NUMBER_ARRAY, "<init>"), new CallStandardMethodIntrinsic(new JsNameRef("numberArrayOfSize", "Kotlin"), false, 1));
|
add(pattern(NUMBER_ARRAY, "<init>"), new CallStandardMethodIntrinsic(new JsNameRef("numberArrayOfSize", "Kotlin"), false, 1));
|
||||||
add(pattern(CHAR_ARRAY, "<init>"), new CallStandardMethodIntrinsic(new JsNameRef("charArrayOfSize", "Kotlin"), false, 1));
|
add(pattern(CHAR_ARRAY, "<init>"), new CallStandardMethodIntrinsic(new JsNameRef("charArrayOfSize", "Kotlin"), false, 1));
|
||||||
add(pattern(BOOLEAN_ARRAY, "<init>"), new CallStandardMethodIntrinsic(new JsNameRef("booleanArrayOfSize", "Kotlin"), false, 1));
|
add(pattern(BOOLEAN_ARRAY, "<init>"), 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ public final class TopLevelFIF extends CompositeFIF {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final CallStandardMethodIntrinsic EQUALS = new CallStandardMethodIntrinsic(new JsNameRef("equals", "Kotlin"), true, 1);
|
public static final CallStandardMethodIntrinsic EQUALS = new CallStandardMethodIntrinsic(new JsNameRef("equals", "Kotlin"), true, 1);
|
||||||
@NotNull
|
@NotNull
|
||||||
public static final FunctionIntrinsic RETURN_RECEIVER_INTRINSIC = new FunctionIntrinsic() {
|
private static final FunctionIntrinsic RETURN_RECEIVER_INTRINSIC = new FunctionIntrinsic() {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public JsExpression apply(
|
public JsExpression apply(
|
||||||
|
|||||||
+32
@@ -19,7 +19,9 @@ package org.jetbrains.k2js.translate.intrinsic.functions.patterns;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
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.FunctionDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
|
|
||||||
@@ -108,4 +110,34 @@ public final class PatternBuilder {
|
|||||||
public static DescriptorPredicate pattern(@NotNull NamePredicate... checkers) {
|
public static DescriptorPredicate pattern(@NotNull NamePredicate... checkers) {
|
||||||
return pattern(Arrays.asList(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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,10 +59,6 @@ var kotlin = {set:function (receiver, key, value) {
|
|||||||
return obj1 === obj2;
|
return obj1 === obj2;
|
||||||
};
|
};
|
||||||
|
|
||||||
Kotlin.array = function (args) {
|
|
||||||
return args === null || args === undefined ? [] : args.slice();
|
|
||||||
};
|
|
||||||
|
|
||||||
Kotlin.intUpto = function (from, to) {
|
Kotlin.intUpto = function (from, to) {
|
||||||
return Kotlin.$new(Kotlin.NumberRange)(from, to);
|
return Kotlin.$new(Kotlin.NumberRange)(from, to);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user