[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.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol 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.types.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.ir.visitors.*
@@ -311,7 +312,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
val invokeSuspendMethod = buildInvokeSuspendMethod(superInvokeSuspendFunction, coroutineClass) val invokeSuspendMethod = buildInvokeSuspendMethod(superInvokeSuspendFunction, coroutineClass)
var coroutineFactoryConstructor: IrConstructor? = null var coroutineFactoryConstructor: IrConstructor? = null
val createMethod: IrSimpleFunction? val ignoredParentSymbols = mutableListOf<IrSymbol>()
if (functionReference != null) { if (functionReference != null) {
// Suspend lambda - create factory methods. // Suspend lambda - create factory methods.
coroutineFactoryConstructor = buildFactoryConstructor(boundFunctionParameters!!) 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 } .atMostOne { it.name == CREATE_IDENTIFIER && it.valueParameters.size == unboundFunctionParameters!!.size + 1 }
?.symbol ?.symbol
createMethod = buildCreateMethod( val createMethod = buildCreateMethod(
unboundArgs = unboundFunctionParameters!!, unboundArgs = unboundFunctionParameters!!,
superFunctionSymbol = createFunctionSymbol, superFunctionSymbol = createFunctionSymbol,
coroutineConstructor = coroutineConstructor coroutineConstructor = coroutineConstructor
) )
val suspendInvokeFunction = val transformedSuspendInvokeFunction = suspendFunctionClass!!.simpleFunctions().single { it.name == OperatorNameConventions.INVOKE }
suspendFunctionClass!!.simpleFunctions().single { it.name == OperatorNameConventions.INVOKE }.let { val originalSuspendInvokeFunction = context.mapping.functionWithContinuationsToSuspendFunctions[transformedSuspendInvokeFunction] ?: transformedSuspendInvokeFunction
context.mapping.functionWithContinuationsToSuspendFunctions[it] ?: it
} ignoredParentSymbols.add(transformedSuspendInvokeFunction.symbol)
buildInvokeMethod( buildInvokeMethod(
functionInvokeFunction = suspendInvokeFunction, functionInvokeFunction = originalSuspendInvokeFunction,
createFunction = createMethod, createFunction = createMethod,
stateMachineFunction = invokeSuspendMethod, stateMachineFunction = invokeSuspendMethod,
) )
} }
coroutineClass.superTypes += superTypes coroutineClass.superTypes += superTypes
coroutineClass.addFakeOverrides(context.typeSystem) coroutineClass.addFakeOverrides(
context.typeSystem,
ignoredParentSymbols = ignoredParentSymbols
)
initializeStateMachine(coroutineConstructors, coroutineClassThis) initializeStateMachine(coroutineConstructors, coroutineClassThis)