Imitate support for suspend modifier on parameterless lambdas

#KT-22766 In Progress
This commit is contained in:
Denis Zharkov
2018-01-24 18:29:38 +03:00
parent 5c81d9fd6b
commit ef01f641f3
10 changed files with 99 additions and 0 deletions
@@ -0,0 +1,31 @@
// WITH_RUNTIME
// WITH_COROUTINES
import helpers.*
import kotlin.coroutines.experimental.*
import kotlin.coroutines.experimental.intrinsics.*
suspend fun suspendHere(v: String): String = suspendCoroutineOrReturn { x ->
x.resume(v)
COROUTINE_SUSPENDED
}
suspend fun foo(): String {
var a = "OK"
var i = 0
val x = suspend {
suspendHere(a[i++].toString())
}
return x() + x.invoke()
}
fun box(): String {
var result = ""
suspend {
result = foo()
}.startCoroutine(EmptyContinuation)
return result
}
@@ -0,0 +1,20 @@
import kotlin.coroutines.experimental.Continuation
import kotlin.coroutines.experimental.CoroutineContext
import kotlin.coroutines.experimental.startCoroutine
fun bar() {
suspend {
println()
}.startCoroutine(object: Continuation<Unit> {
override val context: CoroutineContext
get() = TODO("not implemented")
override fun resume(value: Unit) {
TODO("not implemented")
}
override fun resumeWithException(exception: Throwable) {
TODO("not implemented")
}
})
}
@@ -0,0 +1,3 @@
package
public fun bar(): kotlin.Unit
@@ -6571,6 +6571,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/suspendFunctionTypeCall/simple.kt");
doTest(fileName);
}
@TestMetadata("suspendModifier.kt")
public void testSuspendModifier() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/suspendFunctionTypeCall/suspendModifier.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/codegen/box/coroutines/tailCallOptimizations")
@@ -1398,6 +1398,12 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW
doTest(fileName);
}
@TestMetadata("suspendLambda.kt")
public void testSuspendLambda() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendLambda.kt");
doTest(fileName);
}
@TestMetadata("suspendOverridability.kt")
public void testSuspendOverridability() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendOverridability.kt");
@@ -1398,6 +1398,12 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno
doTest(fileName);
}
@TestMetadata("suspendLambda.kt")
public void testSuspendLambda() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendLambda.kt");
doTest(fileName);
}
@TestMetadata("suspendOverridability.kt")
public void testSuspendOverridability() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendOverridability.kt");
@@ -6571,6 +6571,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/suspendFunctionTypeCall/simple.kt");
doTest(fileName);
}
@TestMetadata("suspendModifier.kt")
public void testSuspendModifier() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/suspendFunctionTypeCall/suspendModifier.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/codegen/box/coroutines/tailCallOptimizations")
@@ -6571,6 +6571,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/suspendFunctionTypeCall/simple.kt");
doTest(fileName);
}
@TestMetadata("suspendModifier.kt")
public void testSuspendModifier() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/suspendFunctionTypeCall/suspendModifier.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/codegen/box/coroutines/tailCallOptimizations")
@@ -7147,6 +7147,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/suspendFunctionTypeCall/simple.kt");
doTest(fileName);
}
@TestMetadata("suspendModifier.kt")
public void testSuspendModifier() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/suspendFunctionTypeCall/suspendModifier.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/codegen/box/coroutines/tailCallOptimizations")
@@ -0,0 +1,9 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package kotlin
@kotlin.internal.InlineOnly
public inline fun <R> suspend(noinline block: suspend () -> R): suspend () -> R = block