From 4ddbb8910369b8e6c1a8db21adf41faf425841b7 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 13 Apr 2022 22:31:23 +0300 Subject: [PATCH] [JS] Manually change receiver's type of Char's equals method Char's equals method in js doesn't work properly because now equals method is not fake override in Char, but it is actual override and so when we call equals for some char in js, it will not be boxed. To fix it we need to get correct receiver's type. --- .../kotlin/js/translate/callTranslator/CallInfo.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt index b221f15e262..ac432e4b75b 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt @@ -16,6 +16,8 @@ package org.jetbrains.kotlin.js.translate.callTranslator +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.contracts.parsing.isEqualsDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor @@ -137,8 +139,12 @@ private fun TranslationContext.createCallInfo( var dispatchReceiver = getDispatchReceiver() var dispatchReceiverType = resolvedCall.smartCastDispatchReceiverType ?: resolvedCall.dispatchReceiver?.type - if (dispatchReceiverType != null && (resolvedCall.resultingDescriptor as? FunctionDescriptor)?.kind?.isReal == false) { - dispatchReceiverType = TranslationUtils.getDispatchReceiverTypeForCoercion(resolvedCall.resultingDescriptor) + if (dispatchReceiverType != null) { + if ((resolvedCall.resultingDescriptor as? FunctionDescriptor)?.kind?.isReal == false) { + dispatchReceiverType = TranslationUtils.getDispatchReceiverTypeForCoercion(resolvedCall.resultingDescriptor) + } else if (KotlinBuiltIns.isChar(dispatchReceiverType) && resolvedCall.resultingDescriptor.isEqualsDescriptor()) { + dispatchReceiverType = resolvedCall.resultingDescriptor.overriddenDescriptors.single().dispatchReceiverParameter!!.type + } } var extensionReceiver = getExtensionReceiver() var notNullConditional: JsConditional? = null