JVM IR: Fix suspend lambda generic signatures

This commit is contained in:
Steven Schäfer
2020-02-17 13:33:00 +01:00
committed by Ilmir Usmanov
parent e6efb81014
commit 272f6abe69
6 changed files with 94 additions and 1 deletions
@@ -164,7 +164,7 @@ private class AddContinuationLowering(private val context: JvmBackendContext) :
functionNClass,
hasQuestionMark = false,
arguments = (info.function.explicitParameters.subList(0, info.arity).map { it.type }
+ info.function.continuationType() + info.function.returnType)
+ info.function.continuationType() + context.irBuiltIns.anyNType)
.map { makeTypeProjection(it, Variance.INVARIANT) },
annotations = emptyList()
)
@@ -0,0 +1,73 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
import java.util.Date
fun assertEquals(expected: String, actual: Any) {
if ("$actual" != expected)
throw AssertionError("Fail, expected: $expected, actual: $actual")
}
fun assertGenericSuper(expected: String, function: Any?) {
val clazz = (function as java.lang.Object).getClass()!!
val genericSuper = clazz.getGenericInterfaces()[0]!!
assertEquals(expected, genericSuper)
}
val unitFun = suspend { }
val intFun = suspend { 42 }
fun assertStringParamFun(lambda: suspend (String) -> Unit) {
assertEquals(
"kotlin.jvm.functions.Function2<java.lang.String, kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>",
lambda.javaClass.genericInterfaces.single()
)
}
fun assertListFun(lambda: suspend (List<String>) -> Unit) {
assertEquals(
"kotlin.jvm.functions.Function2<java.util.List<? extends java.lang.String>, kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>",
lambda.javaClass.genericInterfaces.single()
)
}
fun assertMutableListFun(lambda: suspend (MutableList<Double>) -> MutableList<Int>) {
assertEquals(
"kotlin.jvm.functions.Function2<java.util.List<java.lang.Double>, kotlin.coroutines.Continuation<? super java.util.List<java.lang.Integer>>, java.lang.Object>",
lambda.javaClass.genericInterfaces.single()
)
}
fun assertFunWithIn(lambda: suspend (Comparable<String>) -> Unit) {
assertEquals(
"kotlin.jvm.functions.Function2<java.lang.Comparable<? super java.lang.String>, kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>",
lambda.javaClass.genericInterfaces.single()
)
}
fun assertExtensionFun(lambda: suspend Any.() -> Unit) {
assertEquals(
"kotlin.jvm.functions.Function2<java.lang.Object, kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>",
lambda.javaClass.genericInterfaces.single()
)
}
fun assertExtensionWithArgFun(lambda: suspend Long.(x: Any) -> Date) {
assertEquals(
"kotlin.jvm.functions.Function3<java.lang.Long, java.lang.Object, kotlin.coroutines.Continuation<? super java.util.Date>, java.lang.Object>",
lambda.javaClass.genericInterfaces.single()
)
}
fun box(): String {
assertGenericSuper("kotlin.jvm.functions.Function1<kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>", unitFun)
assertGenericSuper("kotlin.jvm.functions.Function1<kotlin.coroutines.Continuation<? super java.lang.Integer>, java.lang.Object>", intFun)
assertStringParamFun { x: String -> }
assertListFun { l: List<String> -> l }
assertMutableListFun { l -> null!! }
assertFunWithIn { x -> }
assertExtensionFun { }
assertExtensionWithArgFun { x -> Date() }
return "OK"
}
@@ -24420,6 +24420,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
public void testSignatureOfSimpleInnerSimpleOuter() throws Exception {
runTest("compiler/testData/codegen/box/reflection/genericSignature/signatureOfSimpleInnerSimpleOuter.kt");
}
@TestMetadata("suspendFunctionLiteralGenericSignature.kt")
public void testSuspendFunctionLiteralGenericSignature() throws Exception {
runTest("compiler/testData/codegen/box/reflection/genericSignature/suspendFunctionLiteralGenericSignature.kt");
}
}
@TestMetadata("compiler/testData/codegen/box/reflection/isInstance")
@@ -23237,6 +23237,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
public void testSignatureOfSimpleInnerSimpleOuter() throws Exception {
runTest("compiler/testData/codegen/box/reflection/genericSignature/signatureOfSimpleInnerSimpleOuter.kt");
}
@TestMetadata("suspendFunctionLiteralGenericSignature.kt")
public void testSuspendFunctionLiteralGenericSignature() throws Exception {
runTest("compiler/testData/codegen/box/reflection/genericSignature/suspendFunctionLiteralGenericSignature.kt");
}
}
@TestMetadata("compiler/testData/codegen/box/reflection/isInstance")
@@ -22924,6 +22924,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
public void testSignatureOfSimpleInnerSimpleOuter() throws Exception {
runTest("compiler/testData/codegen/box/reflection/genericSignature/signatureOfSimpleInnerSimpleOuter.kt");
}
@TestMetadata("suspendFunctionLiteralGenericSignature.kt")
public void testSuspendFunctionLiteralGenericSignature() throws Exception {
runTest("compiler/testData/codegen/box/reflection/genericSignature/suspendFunctionLiteralGenericSignature.kt");
}
}
@TestMetadata("compiler/testData/codegen/box/reflection/isInstance")
@@ -22924,6 +22924,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
public void testSignatureOfSimpleInnerSimpleOuter() throws Exception {
runTest("compiler/testData/codegen/box/reflection/genericSignature/signatureOfSimpleInnerSimpleOuter.kt");
}
@TestMetadata("suspendFunctionLiteralGenericSignature.kt")
public void testSuspendFunctionLiteralGenericSignature() throws Exception {
runTest("compiler/testData/codegen/box/reflection/genericSignature/suspendFunctionLiteralGenericSignature.kt");
}
}
@TestMetadata("compiler/testData/codegen/box/reflection/isInstance")