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")
|
||||
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
|
||||
|
||||
// "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
|
||||
|
||||
|
||||
+37
@@ -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<Name> 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<JsExpression> 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, "<init>"), new CallStandardMethodIntrinsic(new JsNameRef("numberArrayOfSize", "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(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
|
||||
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(
|
||||
|
||||
+32
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user