[JS IR] Clean up coroutine code

This commit is contained in:
Roman Artemev
2020-03-02 14:17:30 +03:00
committed by romanart
parent c4efd5a09b
commit 65011f96cc
2 changed files with 14 additions and 30 deletions
@@ -67,20 +67,15 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
private val builtCoroutines = mutableMapOf<IrFunction, BuiltCoroutine>() private val builtCoroutines = mutableMapOf<IrFunction, BuiltCoroutine>()
override fun lower(irBody: IrBody, container: IrDeclaration) { override fun lower(irBody: IrBody, container: IrDeclaration) {
transformToCoroutine(irBody, container) if (container is IrSimpleFunction && container.isSuspend) {
} transformSuspendFunction(container, irBody)?.let {
val dc = container.parent as IrDeclarationContainer
dc.addChild(it)
private fun transformToCoroutine(irBody: IrBody, container: IrDeclaration) { }
if (container !is IrSimpleFunction || !container.isSuspend) return
transformSuspendFunction2(container, irBody)?.let {
val dc = container.parent as IrDeclarationContainer
dc.addChild(it)
} }
} }
private fun getSuspendFunctionKind2(function: IrSimpleFunction, body: IrBody): SuspendFunctionKind { private fun getSuspendFunctionKind(function: IrSimpleFunction, body: IrBody): SuspendFunctionKind {
fun IrSimpleFunction.isSuspendLambda() = fun IrSimpleFunction.isSuspendLambda() =
name.asString() == "invoke" && parentClassOrNull?.let { it.origin === CallableReferenceLowering.Companion.LAMBDA_IMPL } == true name.asString() == "invoke" && parentClassOrNull?.let { it.origin === CallableReferenceLowering.Companion.LAMBDA_IMPL } == true
@@ -136,10 +131,10 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
} }
} }
private fun transformSuspendFunction2(function: IrSimpleFunction, body: IrBody): IrClass? { private fun transformSuspendFunction(function: IrSimpleFunction, body: IrBody): IrClass? {
assert(function.isSuspend) assert(function.isSuspend)
return when (val functionKind = getSuspendFunctionKind2(function, body)) { return when (val functionKind = getSuspendFunctionKind(function, body)) {
is SuspendFunctionKind.NO_SUSPEND_CALLS -> { is SuspendFunctionKind.NO_SUSPEND_CALLS -> {
null // No suspend function calls - just an ordinary function. null // No suspend function calls - just an ordinary function.
} }
@@ -150,7 +145,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
} }
is SuspendFunctionKind.NEEDS_STATE_MACHINE -> { is SuspendFunctionKind.NEEDS_STATE_MACHINE -> {
val coroutine = buildCoroutine2(function) // Coroutine implementation. val coroutine = buildCoroutine(function) // Coroutine implementation.
if (coroutine === function.parent) // Suspend lambdas are called through factory method <create>, if (coroutine === function.parent) // Suspend lambdas are called through factory method <create>,
null null
else else
@@ -180,8 +175,8 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
} }
} }
private fun buildCoroutine2(function: IrSimpleFunction): IrClass { private fun buildCoroutine(function: IrSimpleFunction): IrClass {
val coroutine = CoroutineBuilder2(function).build() val coroutine = CoroutineBuilder(function).build()
val isSuspendLambda = coroutine.coroutineClass === function.parent val isSuspendLambda = coroutine.coroutineClass === function.parent
@@ -201,7 +196,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
return coroutine.coroutineClass return coroutine.coroutineClass
} }
private inner class CoroutineBuilder2(private val function: IrSimpleFunction) { private inner class CoroutineBuilder(private val function: IrSimpleFunction) {
private val startOffset = function.startOffset private val startOffset = function.startOffset
private val endOffset = function.endOffset private val endOffset = function.endOffset
private val isSuspendLambda = function.isOperator && function.name.asString() == "invoke" && function.parentClassOrNull private val isSuspendLambda = function.isOperator && function.name.asString() == "invoke" && function.parentClassOrNull
@@ -482,6 +477,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
coroutineClass.addFakeOverrides(implementedMembers) coroutineClass.addFakeOverrides(implementedMembers)
// TODO: to meet PIR lower model constructor modification shouldn't be performed here
initializeStateMachine(listOf(coroutineConstructor), coroutineClassThis) initializeStateMachine(listOf(coroutineConstructor), coroutineClassThis)
return BuiltCoroutine( return BuiltCoroutine(
@@ -577,13 +573,3 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
} }
} }
} }
//private val IrDeclaration.isLambda
// get() = origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA
//class RemoveSuspendLambdas() : DeclarationTransformer {
//
// override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
// return if (declaration.isLambda && declaration is IrFunction && declaration.isSuspend) emptyList() else null
// }
//}
@@ -130,8 +130,6 @@ class JsSuspendFunctionsLowering(ctx: JsIrBackendContext) : AbstractSuspendFunct
IrBlockBodyImpl(stateMachineFunction.startOffset, stateMachineFunction.endOffset, listOf(suspendResult, rootLoop)) IrBlockBodyImpl(stateMachineFunction.startOffset, stateMachineFunction.endOffset, listOf(suspendResult, rootLoop))
stateMachineFunction.body = functionBody stateMachineFunction.body = functionBody
// TODO: Investigate parent problems
stateMachineFunction.patchDeclarationParents(stateMachineFunction.parent)
// Move return targets to new function // Move return targets to new function
functionBody.transformChildrenVoid(object : IrElementTransformerVoid() { functionBody.transformChildrenVoid(object : IrElementTransformerVoid() {