[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.
This commit is contained in:
Pavel Kunyavskiy
2022-10-04 17:23:53 +02:00
committed by Space Team
parent 5ba76ee757
commit 467d2b42fc
@@ -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<C : CommonBackendContext>(val co
val invokeSuspendMethod = buildInvokeSuspendMethod(superInvokeSuspendFunction, coroutineClass)
var coroutineFactoryConstructor: IrConstructor? = null
val createMethod: IrSimpleFunction?
val ignoredParentSymbols = mutableListOf<IrSymbol>()
if (functionReference != null) {
// Suspend lambda - create factory methods.
coroutineFactoryConstructor = buildFactoryConstructor(boundFunctionParameters!!)
@@ -320,26 +321,29 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(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)