JS backend: make intrinsic array factory methods.

#KT-2511 fixed

(cherry picked from commit 31843c5)
This commit is contained in:
develar
2012-09-06 20:12:54 +04:00
committed by Zalim Bashorov
parent e0a899902c
commit 1af35a6aff
5 changed files with 70 additions and 14 deletions
-9
View File
@@ -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
@@ -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);
}
}
@@ -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(
@@ -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);
}
}
-4
View File
@@ -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);
};