JS backend: fixed intrinsic of the typed array factory methods(intArray etc).

This commit is contained in:
Zalim Bashorov
2013-07-23 19:34:26 +04:00
parent 1af35a6aff
commit d4bf98de97
5 changed files with 36 additions and 30 deletions
@@ -60,4 +60,8 @@ public final class StandardClassesTest extends SingleFileTranslationTest {
public void testArraysIterator() throws Exception {
fooBoxTest(failOnEcma5());
}
public void testArrayFactoryMethods() throws Exception {
checkFooBoxIsOk();
}
}
@@ -22,11 +22,15 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.plugin.JetLanguage;
/**
* Encapuslates different types of constants and naming conventions.
*/
public final class Namer {
public static final String KOTLIN_NAME = JetLanguage.NAME;
public static final String KOTLIN_LOWER_NAME = KOTLIN_NAME.toLowerCase();
public static final String CALLEE_NAME = "$fun";
private static final String INITIALIZE_METHOD_NAME = "initialize";
@@ -37,7 +41,6 @@ public final class Namer {
private static final String GETTER_PREFIX = "get_";
private static final String BACKING_FIELD_PREFIX = "$";
private static final String SUPER_METHOD_NAME = "super_init";
private static final String KOTLIN_OBJECT_NAME = "Kotlin";
private static final String ROOT_NAMESPACE = "_";
private static final String RECEIVER_PARAMETER_NAME = "receiver";
private static final String CLASSES_OBJECT_NAME = "classes";
@@ -123,7 +126,7 @@ public final class Namer {
private final JsName isTypeName;
private Namer(@NotNull JsScope rootScope) {
kotlinName = rootScope.declareName(KOTLIN_OBJECT_NAME);
kotlinName = rootScope.declareName(KOTLIN_NAME);
kotlinScope = new JsScope(rootScope, "Kotlin standard object");
traitName = kotlinScope.declareName(TRAIT_OBJECT_NAME);
@@ -22,23 +22,20 @@ 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.Namer;
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;
import static com.intellij.openapi.util.text.StringUtil.decapitalize;
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern;
public final class ArrayFIF extends CompositeFIF {
@@ -58,12 +55,18 @@ public final class ArrayFIF extends CompositeFIF {
@NotNull
private static final NamePredicate ARRAYS;
@NotNull
private static final DescriptorPredicate ARRAY_FACTORY_METHODS;
static {
List<Name> arrayTypeNames = Lists.newArrayList();
for (PrimitiveType type : PrimitiveType.NUMBER_TYPES) {
if (type != PrimitiveType.CHAR) {
arrayTypeNames.add(type.getArrayTypeName());
List<Name> arrayFactoryMethodNames = Lists.newArrayList(Name.identifier("array"));
for (PrimitiveType type : PrimitiveType.values()) {
Name arrayTypeName = type.getArrayTypeName();
if (type != PrimitiveType.CHAR && type != PrimitiveType.BOOLEAN) {
arrayTypeNames.add(arrayTypeName);
}
arrayFactoryMethodNames.add(Name.identifier(decapitalize(arrayTypeName.asString())));
}
Name arrayName = Name.identifier("Array");
@@ -79,6 +82,7 @@ public final class ArrayFIF extends CompositeFIF {
arrayTypeNames.add(booleanArrayName);
arrayTypeNames.add(arrayName);
ARRAYS = new NamePredicate(arrayTypeNames);
ARRAY_FACTORY_METHODS = pattern(Namer.KOTLIN_LOWER_NAME, new NamePredicate(arrayFactoryMethodNames));
}
private static final FunctionIntrinsic ARRAY_INTRINSIC = new FunctionIntrinsic() {
@@ -140,22 +144,6 @@ 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);
add(ARRAY_FACTORY_METHODS, ARRAY_INTRINSIC);
}
}
@@ -24,6 +24,7 @@ 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.k2js.translate.context.Namer;
import java.util.Arrays;
import java.util.List;
@@ -33,6 +34,9 @@ public final class PatternBuilder {
@NotNull
private static final NamePredicate JET = new NamePredicate("jet");
@NotNull
private static final Name KOTLIN_NAME = Name.identifier(Namer.KOTLIN_LOWER_NAME);
private PatternBuilder() {
}
@@ -69,8 +73,16 @@ public final class PatternBuilder {
@NotNull
private static DescriptorPredicate pattern(@NotNull List<NamePredicate> checkers) {
final List<NamePredicate> checkersWithPrefixChecker = Lists.newArrayList(JET);
assert !checkers.isEmpty();
final List<NamePredicate> checkersWithPrefixChecker = Lists.newArrayList();
if (!checkers.get(0).apply(KOTLIN_NAME)) {
checkersWithPrefixChecker.add(JET);
}
checkersWithPrefixChecker.addAll(checkers);
assert checkersWithPrefixChecker.size() > 1;
return new DescriptorPredicate() {
@Override
public boolean apply(@Nullable FunctionDescriptor descriptor) {
@@ -89,8 +101,7 @@ public final class PatternBuilder {
if (nameParts.size() != checkersWithPrefixChecker.size()) {
return false;
}
if (!allNamePartsValid(nameParts)) return false;
return true;
return allNamePartsValid(nameParts);
}
private boolean allNamePartsValid(@NotNull List<Name> nameParts) {