diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt index 5ccbd34f408..c5a2e671bfa 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt @@ -215,9 +215,9 @@ class FunctionAndSignature(val function: IrSimpleFunction) { function.name.asString(), function.extensionReceiverParameter?.type?.asString(), function.valueParameters.map { it.type.asString() }, - // Return type used in signature for inline classes only because + // Return type used in signature for inline classes and Unit because // they are binary incompatible with supertypes and require bridges. - function.returnType.run { if (isInlined()) asString() else null } + function.returnType.run { if (isInlined() || isUnit()) asString() else null } ) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/NameTables.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/NameTables.kt index b006bc52b34..ec66492f251 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/NameTables.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/NameTables.kt @@ -5,11 +5,13 @@ package org.jetbrains.kotlin.ir.backend.js.utils +import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny import org.jetbrains.kotlin.backend.common.ir.isTopLevel import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrLoop +import org.jetbrains.kotlin.ir.types.isUnit import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.ir.util.isEffectivelyExternal import org.jetbrains.kotlin.ir.util.isInlined @@ -254,8 +256,8 @@ class LegacyMemberNameGenerator(val scope: JsScope) { val nameBuilder = StringBuilder() // Handle names for special functions - if (declaration.isEqualsInheritedFromAny()) { - return scope.declareName("equals") + if (declaration.isMethodOfAny()) { + return scope.declareName(declarationName) } nameBuilder.append(declarationName) @@ -272,9 +274,9 @@ class LegacyMemberNameGenerator(val scope: JsScope) { joinTo(nameBuilder, "") { "_${it.type.asString()}" } } declaration.returnType.let { - // Return type is only used in signature for inline class types because + // Return type is only used in signature for inline class and Unit types because // they are binary incompatible with supertypes. - if (it.isInlined()) { + if (it.isInlined() || it.isUnit()) { nameBuilder.append("_ret$${it.asString()}") } } diff --git a/js/js.translator/testData/box/coercion/bridgeChar.kt b/js/js.translator/testData/box/coercion/bridgeChar.kt index 53d90c68252..894b781a4d8 100644 --- a/js/js.translator/testData/box/coercion/bridgeChar.kt +++ b/js/js.translator/testData/box/coercion/bridgeChar.kt @@ -4,6 +4,7 @@ open class A { } interface I { + @JsName("foo") fun foo(): Any } diff --git a/js/js.translator/testData/box/coercion/derivedFunctionReturningUnit.kt b/js/js.translator/testData/box/coercion/derivedFunctionReturningUnit.kt index 94363305a5f..84893e2e8d1 100644 --- a/js/js.translator/testData/box/coercion/derivedFunctionReturningUnit.kt +++ b/js/js.translator/testData/box/coercion/derivedFunctionReturningUnit.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1292 var log = "" diff --git a/js/js.translator/testData/box/dynamic/_common.kt b/js/js.translator/testData/box/dynamic/_common.kt index 37e1986bba7..3a52f377b12 100644 --- a/js/js.translator/testData/box/dynamic/_common.kt +++ b/js/js.translator/testData/box/dynamic/_common.kt @@ -11,5 +11,6 @@ object t { } object n { + @JsName("valueOf") fun valueOf() = 42 } diff --git a/js/js.translator/testData/box/jsCode/tryCatchFinally.kt b/js/js.translator/testData/box/jsCode/tryCatchFinally.kt index 027f315b220..e06c37a141d 100644 --- a/js/js.translator/testData/box/jsCode/tryCatchFinally.kt +++ b/js/js.translator/testData/box/jsCode/tryCatchFinally.kt @@ -4,6 +4,7 @@ package foo class Counter { var count: Int = 0 + @JsName("inc") public fun inc() { count++ } diff --git a/js/js.translator/testData/box/trait/checkImplementationCharacteristics.kt b/js/js.translator/testData/box/trait/checkImplementationCharacteristics.kt index feaa4b1e492..f3224ad2071 100644 --- a/js/js.translator/testData/box/trait/checkImplementationCharacteristics.kt +++ b/js/js.translator/testData/box/trait/checkImplementationCharacteristics.kt @@ -1,10 +1,12 @@ // EXPECTED_REACHABLE_NODES: 1301 public interface A { + @JsName("foo") fun foo() { } } public interface B : A { + @JsName("boo") fun boo() { } } diff --git a/libraries/stdlib/js-ir/runtime/long.kt b/libraries/stdlib/js-ir/runtime/long.kt index 90fdb151716..c88d608c080 100644 --- a/libraries/stdlib/js-ir/runtime/long.kt +++ b/libraries/stdlib/js-ir/runtime/long.kt @@ -253,6 +253,7 @@ public class Long internal constructor( public override fun toDouble(): Double = toNumber() // This method is used by `toString()` + @JsName("valueOf") internal fun valueOf() = toDouble() override fun equals(other: Any?): Boolean = other is Long && equalsLong(other) diff --git a/libraries/stdlib/js/src/kotlin/collections/AbstractMutableCollection.kt b/libraries/stdlib/js/src/kotlin/collections/AbstractMutableCollection.kt index 9f168680d37..164b5845995 100644 --- a/libraries/stdlib/js/src/kotlin/collections/AbstractMutableCollection.kt +++ b/libraries/stdlib/js/src/kotlin/collections/AbstractMutableCollection.kt @@ -44,6 +44,7 @@ public actual abstract class AbstractMutableCollection protected actual const } } + @JsName("toJSON") open fun toJSON(): Any = this.toArray() }