diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt index dba1a9032ea..ef60724ef92 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.calls import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder +import org.jetbrains.kotlin.ir.backend.js.utils.isEqualsInheritedFromAny import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrExpression @@ -172,10 +173,4 @@ class EqualityAndComparisonCallsTransformer(context: JsIrBackendContext) : Calls private fun IrFunction.isMethodOfPotentiallyPrimitiveJSType() = isMethodOfPrimitiveJSType() || isFakeOverriddenFromAny() - private fun IrFunction.isEqualsInheritedFromAny() = - name == Name.identifier("equals") && - dispatchReceiverParameter != null && - valueParameters.size == 1 && - valueParameters[0].type.isNullableAny() - } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt index b7774f968e8..568f7b9242e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt @@ -143,6 +143,11 @@ class SimpleNameGenerator : NameGenerator { } is IrSimpleFunction -> { + // Handle names for special functions + if (declaration.isEqualsInheritedFromAny()) { + return context.staticContext.rootScope.declareName("equals") + } + if (declaration.isStaticMethodOfClass) { nameBuilder.append(getNameForDeclaration(declaration.parent as IrClass, context)) nameBuilder.append('.') diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/misc.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/misc.kt index 4c54896186d..2834e8f6cae 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/misc.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/misc.kt @@ -6,5 +6,14 @@ package org.jetbrains.kotlin.ir.backend.js.utils import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.types.isNullableAny +import org.jetbrains.kotlin.name.Name -fun TODO(element: IrElement): Nothing = TODO(element::class.java.simpleName + " is not supported yet here") \ No newline at end of file +fun TODO(element: IrElement): Nothing = TODO(element::class.java.simpleName + " is not supported yet here") + +fun IrFunction.isEqualsInheritedFromAny() = + name == Name.identifier("equals") && + dispatchReceiverParameter != null && + valueParameters.size == 1 && + valueParameters[0].type.isNullableAny() diff --git a/js/js.translator/testData/box/native/equalsMangling.kt b/js/js.translator/testData/box/native/equalsMangling.kt index db7b2818997..3604271c7ce 100644 --- a/js/js.translator/testData/box/native/equalsMangling.kt +++ b/js/js.translator/testData/box/native/equalsMangling.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1290 data class A(val number: Int) diff --git a/libraries/stdlib/js/irRuntime/core.kt b/libraries/stdlib/js/irRuntime/core.kt index 1c3e85e9402..1be45048151 100644 --- a/libraries/stdlib/js/irRuntime/core.kt +++ b/libraries/stdlib/js/irRuntime/core.kt @@ -14,8 +14,8 @@ fun equals(obj1: dynamic, obj2: dynamic): Boolean { } return js(""" - if (typeof obj1 === "object" && typeof obj1.equals_kotlin_Any_ === "function") { - return obj1.equals_kotlin_Any_(obj2); + if (typeof obj1 === "object" && typeof obj1.equals === "function") { + return obj1.equals(obj2); } if (obj1 !== obj1) {