diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt index d544f98bbf3..458511dab07 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt @@ -246,8 +246,7 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod } private fun createInvokeMethod(clazz: IrClass): IrSimpleFunction { - val superMethods = superFunctionInterface.declarations.filterIsInstance() - val superMethod = superMethods.single { it.name.asString() == "invoke" } + val superMethod = superFunctionInterface.invokeFun!! return clazz.addFunction { setSourceRange(if (isLambda) function else reference) name = superMethod.name @@ -255,9 +254,7 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod isSuspend = superMethod.isSuspend isOperator = superMethod.isOperator }.apply { - val secondSuperMethods: List? = - secondFunctionInterface?.declarations?.filterIsInstance() - val secondSuperMethod = secondSuperMethods?.single { it.name.asString() == "invoke" } + val secondSuperMethod = secondFunctionInterface?.let { it.invokeFun!! } overriddenSymbols = listOfNotNull( superMethod.symbol, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/InteropCallableReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/InteropCallableReferenceLowering.kt index a7270261174..ddd2e52c54b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/InteropCallableReferenceLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/InteropCallableReferenceLowering.kt @@ -218,7 +218,7 @@ class InteropCallableReferenceLowering(val context: JsIrBackendContext) : BodyLo lambdaClass: IrClass, newDeclarations: MutableList ): IrBlockBody { - val invokeFun = lambdaClass.declarations.filterIsInstance().single { it.name.asString() == "invoke" } + val invokeFun = lambdaClass.invokeFun!! val superInvokeFun = invokeFun.overriddenSymbols.first { it.owner.isSuspend == invokeFun.isSuspend }.owner val lambdaName = Name.identifier("${lambdaClass.name.asString()}\$lambda") 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 ac5f8cad91d..3af9de48223 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 @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.types.getClass import org.jetbrains.kotlin.ir.types.isNullableAny +import org.jetbrains.kotlin.ir.util.invokeFun import org.jetbrains.kotlin.ir.util.isEffectivelyExternal import org.jetbrains.kotlin.ir.util.isTopLevelDeclaration import org.jetbrains.kotlin.name.Name @@ -116,8 +117,6 @@ fun invokeFunForLambda(call: IrCall) = call.extensionReceiver!! .type .getClass()!! - .declarations - .filterIsInstance() - .single { it.name.asString() == "invoke" } + .invokeFun!! fun IrFunction.isInlineFunWithReifiedParameter() = isInline && typeParameters.any { it.isReified } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index a780279caad..a7bc2e0ea20 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -197,6 +197,9 @@ val IrClassSymbol.fields: Sequence val IrClass.primaryConstructor: IrConstructor? get() = this.declarations.singleOrNull { it is IrConstructor && it.isPrimary } as IrConstructor? +val IrClass.invokeFun: IrSimpleFunction? + get() = declarations.filterIsInstance().singleOrNull { it.name.asString() == "invoke" } + val IrDeclarationContainer.properties: Sequence get() = declarations.asSequence().filterIsInstance() @@ -623,4 +626,4 @@ val IrDeclarationParent.isFacadeClass: Boolean get() = this is IrClass && (origin == IrDeclarationOrigin.JVM_MULTIFILE_CLASS || origin == IrDeclarationOrigin.FILE_CLASS || - origin == IrDeclarationOrigin.SYNTHETIC_FILE_CLASS) \ No newline at end of file + origin == IrDeclarationOrigin.SYNTHETIC_FILE_CLASS)