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 2370276a434..69a2e570366 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.bridges.FunctionHandle +import org.jetbrains.kotlin.backend.common.bridges.findInterfaceImplementation import org.jetbrains.kotlin.backend.common.bridges.generateBridges import org.jetbrains.kotlin.backend.common.ir.copyTo import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom @@ -60,11 +61,6 @@ class BridgesConstruction(val context: JsIrBackendContext) : ClassLoweringPass { .filter { !it.isStaticMethodOfClass } .toList() .forEach { generateBridges(it, irClass) } - - irClass.declarations - .filterIsInstance() - .flatMap { listOfNotNull(it.getter, it.setter) } - .forEach { generateBridges(it, irClass) } } private fun generateBridges(function: IrSimpleFunction, irClass: IrClass) { @@ -106,7 +102,7 @@ class BridgesConstruction(val context: JsIrBackendContext) : ClassLoweringPass { val irFunction = JsIrBuilder.buildFunction( bridge.name, bridge.returnType, - delegateTo.parent, + function.parent, bridge.visibility, bridge.modality, // TODO: should copy modality? bridge.isInline, @@ -167,7 +163,7 @@ class BridgesConstruction(val context: JsIrBackendContext) : ClassLoweringPass { // Handle for common.bridges data class IrBasedFunctionHandle(val function: IrSimpleFunction) : FunctionHandle { - override val isDeclaration: Boolean = true + override val isDeclaration: Boolean = function.isReal || findInterfaceImplementation(function.descriptor) != null override val isAbstract: Boolean = function.modality == Modality.ABSTRACT @@ -197,6 +193,8 @@ class FunctionAndSignature(val function: IrSimpleFunction) { function.name, function.extensionReceiverParameter?.type?.asString(), function.valueParameters.map { it.type.asString() }, + // Return type used in signature for inline classes only because + // they are binary incompatible with supertypes and require bridges. function.returnType.run { if (isInlined()) asString() else null } ) 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 9d53a3d62a9..a3abad84498 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 @@ -204,6 +204,8 @@ class SimpleNameGenerator : NameGenerator { joinTo(nameBuilder, "") { "_${it.type.asString()}" } } declaration.returnType.let { + // Return type is only used in signature for inline class types because + // they are binary incompatible with supertypes. if (it.isInlined()) { nameBuilder.append("_ret$${it.asString()}") }