From 467d2b42fc0d8fb7a174bf8423c11ef8890bdbf1 Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Tue, 4 Oct 2022 17:23:53 +0200 Subject: [PATCH] [K/N] Make AbstractSuspendFunctionsLowering independent of files order When coroutine class is created, it's made child of SuspendFunction class. Normally, SuspendFunction class can't be already lowered, but if we are compiling stdlib it can happen. And if it is bad fake overrides would be created before this commit. Unfortunately, as problem can happen only during stdlib compilation, no specific test can be added. --- .../lower/AbstractSuspendFunctionsLowering.kt | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt index c64199b569a..5c7208593d0 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.* @@ -311,7 +312,7 @@ abstract class AbstractSuspendFunctionsLowering(val co val invokeSuspendMethod = buildInvokeSuspendMethod(superInvokeSuspendFunction, coroutineClass) var coroutineFactoryConstructor: IrConstructor? = null - val createMethod: IrSimpleFunction? + val ignoredParentSymbols = mutableListOf() if (functionReference != null) { // Suspend lambda - create factory methods. coroutineFactoryConstructor = buildFactoryConstructor(boundFunctionParameters!!) @@ -320,26 +321,29 @@ abstract class AbstractSuspendFunctionsLowering(val co .atMostOne { it.name == CREATE_IDENTIFIER && it.valueParameters.size == unboundFunctionParameters!!.size + 1 } ?.symbol - createMethod = buildCreateMethod( + val createMethod = buildCreateMethod( unboundArgs = unboundFunctionParameters!!, superFunctionSymbol = createFunctionSymbol, coroutineConstructor = coroutineConstructor ) - val suspendInvokeFunction = - suspendFunctionClass!!.simpleFunctions().single { it.name == OperatorNameConventions.INVOKE }.let { - context.mapping.functionWithContinuationsToSuspendFunctions[it] ?: it - } + val transformedSuspendInvokeFunction = suspendFunctionClass!!.simpleFunctions().single { it.name == OperatorNameConventions.INVOKE } + val originalSuspendInvokeFunction = context.mapping.functionWithContinuationsToSuspendFunctions[transformedSuspendInvokeFunction] ?: transformedSuspendInvokeFunction + + ignoredParentSymbols.add(transformedSuspendInvokeFunction.symbol) buildInvokeMethod( - functionInvokeFunction = suspendInvokeFunction, + functionInvokeFunction = originalSuspendInvokeFunction, createFunction = createMethod, stateMachineFunction = invokeSuspendMethod, ) } coroutineClass.superTypes += superTypes - coroutineClass.addFakeOverrides(context.typeSystem) + coroutineClass.addFakeOverrides( + context.typeSystem, + ignoredParentSymbols = ignoredParentSymbols + ) initializeStateMachine(coroutineConstructors, coroutineClassThis)