JVM_IR: basic suspend conversion on argument test passed

This commit is contained in:
Dmitry Petrov
2020-04-29 10:42:04 +03:00
parent 819634c4cd
commit d9fd51c608
9 changed files with 145 additions and 4 deletions
@@ -95,13 +95,15 @@ private class AddContinuationLowering(private val context: JvmBackendContext) :
override fun visitFunctionReference(expression: IrFunctionReference) {
expression.acceptChildrenVoid(this)
if (expression.isSuspend && expression.isLambdaOrAdaptedCallableReference() && expression !in inlineReferences) {
if (expression.isSuspend && expression.shouldBeTreatedAsSuspendLambda() && expression !in inlineReferences) {
suspendLambdas[expression] = SuspendLambdaInfo(expression)
}
}
private fun IrFunctionReference.isLambdaOrAdaptedCallableReference() =
origin == IrStatementOrigin.LAMBDA || origin == IrStatementOrigin.ADAPTED_FUNCTION_REFERENCE
private fun IrFunctionReference.shouldBeTreatedAsSuspendLambda() =
origin == IrStatementOrigin.LAMBDA ||
origin == IrStatementOrigin.ADAPTED_FUNCTION_REFERENCE ||
origin == IrStatementOrigin.SUSPEND_CONVERSION
})
for (lambda in suspendLambdas.values) {
@@ -456,7 +456,12 @@ private fun StatementGenerator.createFunctionForSuspendConversion(
if (suspendFunReturnType.isUnit()) {
+irAdapteeCall
} else {
+irReturn(irAdapteeCall)
+IrReturnImpl(
startOffset, endOffset,
context.irBuiltIns.nothingType,
irAdapterFun.symbol,
irAdapteeCall
)
}
}