From 516af6c908889c3824054dd1aa8a1ddf5223c005 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Tue, 17 Jun 2014 15:46:29 +0400 Subject: [PATCH] JS backend: added expected receiver type for intrinsics. --- .../functions/factories/StringOperationFIF.java | 4 ++-- .../functions/factories/TopLevelFIF.java | 10 +++++----- .../functions/patterns/PatternBuilder.java | 16 +++++++++++----- .../k2js/translate/utils/TranslationUtils.java | 8 ++++---- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java index cb29cba3a65..05ba9c0eb6e 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java @@ -27,7 +27,7 @@ public final class StringOperationFIF extends CompositeFIF { private StringOperationFIF() { add(pattern("kotlin", "String", "get"), new BuiltInFunctionIntrinsic("charAt")); - add(pattern("js", "length").receiverExists(), LENGTH_PROPERTY_INTRINSIC); - add(pattern("js", "isEmpty").receiverExists(), IS_EMPTY_INTRINSIC); + add(pattern("js", "length").isExtensionOf("kotlin.CharSequence"), LENGTH_PROPERTY_INTRINSIC); + add(pattern("js", "isEmpty").isExtensionOf("kotlin.CharSequence"), IS_EMPTY_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 4dd47724e3f..6e712ceec86 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 @@ -159,18 +159,18 @@ public final class TopLevelFIF extends CompositeFIF { private TopLevelFIF() { add(EQUALS_IN_ANY, KOTLIN_EQUALS); - add(pattern("kotlin", "toString").receiverExists(), TO_STRING); - add(pattern("kotlin", "equals").receiverExists(), KOTLIN_EQUALS); - add(pattern("kotlin", "identityEquals").receiverExists(), IDENTITY_EQUALS); + add(pattern("kotlin", "toString").isExtensionOf("kotlin.Any"), TO_STRING); + add(pattern("kotlin", "equals").isExtensionOf("kotlin.Any"), KOTLIN_EQUALS); + add(pattern("kotlin", "identityEquals").isExtensionOf("kotlin.Any"), IDENTITY_EQUALS); add(HASH_CODE_IN_ANY, KOTLIN_HASH_CODE); add(pattern(NamePredicate.PRIMITIVE_NUMBERS, "equals"), KOTLIN_EQUALS); add(pattern("String|Boolean|Char|Number.equals"), KOTLIN_EQUALS); add(pattern("kotlin", "arrayOfNulls"), new KotlinFunctionIntrinsic("nullArray")); add(pattern("kotlin", "PropertyMetadataImpl", ""), PROPERTY_METADATA_IMPL); - add(pattern("kotlin", "iterator").receiverExists(), RETURN_RECEIVER_INTRINSIC); + add(pattern("kotlin", "iterator").isExtensionOf("kotlin.Iterator"), RETURN_RECEIVER_INTRINSIC); add(pattern("kotlin", "Map", "get").checkOverridden(), NATIVE_MAP_GET); - add(pattern("js", "set").receiverExists(), NATIVE_MAP_SET); + add(pattern("js", "set").isExtensionOf("kotlin.MutableMap"), NATIVE_MAP_SET); add(pattern("java.util", "HashMap", ""), new MapSelectImplementationIntrinsic(false)); add(pattern("java.util", "HashSet", ""), new MapSelectImplementationIntrinsic(true)); 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 33b7199df1c..e675d68a496 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 @@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.k2js.translate.context.Namer; +import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.Arrays; import java.util.List; @@ -127,7 +128,7 @@ public final class PatternBuilder { public static class DescriptorPredicateImpl implements DescriptorPredicate { private final String[] names; - private boolean receiverParameterExists; + private String receiverFqName; private boolean checkOverridden; @@ -135,8 +136,8 @@ public final class PatternBuilder { this.names = names; } - public DescriptorPredicateImpl receiverExists() { - this.receiverParameterExists = true; + public DescriptorPredicateImpl isExtensionOf(String receiverFqName) { + this.receiverFqName = receiverFqName; return this; } @@ -167,8 +168,13 @@ public final class PatternBuilder { @Override public boolean apply(@NotNull FunctionDescriptor functionDescriptor) { - if ((functionDescriptor.getReceiverParameter() == null) == receiverParameterExists) { - return false; + ReceiverParameterDescriptor actualReceiver = functionDescriptor.getReceiverParameter(); + if (actualReceiver != null) { + if (receiverFqName == null) return false; + + String actualReceiverFqName = TranslationUtils.getJetTypeFqName(actualReceiver.getType()); + + if (!actualReceiverFqName.equals(receiverFqName)) return false; } if (!(functionDescriptor.getContainingDeclaration() instanceof ClassDescriptor)) { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 7d1c70de583..e48d5e44bb4 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -267,13 +267,13 @@ public final class TranslationUtils { ReceiverParameterDescriptor receiverParameter = descriptor.getReceiverParameter(); if (receiverParameter != null) { - argTypes.append(getJetTypeName(receiverParameter.getType())).append("."); + argTypes.append(getJetTypeFqName(receiverParameter.getType())).append("."); } argTypes.append(StringUtil.join(descriptor.getValueParameters(), new Function() { @Override public String fun(ValueParameterDescriptor descriptor) { - return getJetTypeName(descriptor.getType()); + return getJetTypeFqName(descriptor.getType()); } }, ",")); @@ -281,12 +281,12 @@ public final class TranslationUtils { } @NotNull - private static String getJetTypeName(@NotNull JetType jetType) { + public static String getJetTypeFqName(@NotNull JetType jetType) { ClassifierDescriptor declaration = jetType.getConstructor().getDeclarationDescriptor(); assert declaration != null; if (declaration instanceof TypeParameterDescriptor) { - return getJetTypeName(((TypeParameterDescriptor) declaration).getUpperBoundsAsType()); + return getJetTypeFqName(((TypeParameterDescriptor) declaration).getUpperBoundsAsType()); } return getFqName(declaration).asString();