Fix suspend function with inline class types in reflection
#KT-34024 Fixed
This commit is contained in:
Generated
+28
-5
@@ -26519,6 +26519,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
public void testProperties() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/properties.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendFunction.kt")
|
||||
public void testSuspendFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/suspendFunction.kt");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27417,11 +27422,6 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/functions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassPrimaryVal.kt")
|
||||
public void testInlineClassPrimaryVal() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClassPrimaryVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineReifiedFun.kt")
|
||||
public void testInlineReifiedFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineReifiedFun.kt");
|
||||
@@ -27510,6 +27510,29 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/inlineClasses")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class InlineClasses extends AbstractFirBlackBoxCodegenTest {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTestWithCustomIgnoreDirective(this::doTest, TargetBackend.JVM_IR, testDataFilePath, "// IGNORE_BACKEND_FIR: ");
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/reflection/mapping/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassPrimaryVal.kt")
|
||||
public void testInlineClassPrimaryVal() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClasses/inlineClassPrimaryVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendFunctionWithInlineClassInSignature.kt")
|
||||
public void testSuspendFunctionWithInlineClassInSignature() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/jvmStatic")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_REFLECT
|
||||
// WITH_COROUTINES
|
||||
|
||||
package test
|
||||
|
||||
import kotlin.coroutines.startCoroutine
|
||||
import kotlin.reflect.full.callSuspend
|
||||
import helpers.*
|
||||
|
||||
inline class Z(val value: String)
|
||||
|
||||
class S {
|
||||
private var value: Z = Z("")
|
||||
|
||||
suspend fun consumeZ(z: Z) { value = z }
|
||||
suspend fun produceZ(): Z = value
|
||||
suspend fun consumeAndProduceZ(z: Z): Z = z
|
||||
}
|
||||
|
||||
private fun run0(f: suspend () -> String): String {
|
||||
var result = ""
|
||||
f.startCoroutine(handleResultContinuation { result = it })
|
||||
return result
|
||||
}
|
||||
|
||||
fun box(): String =
|
||||
run0 {
|
||||
val s = S()
|
||||
S::consumeZ.callSuspend(s, Z("z"))
|
||||
val v = S::produceZ.callSuspend(s)
|
||||
if (v != Z("z")) "Fail: $v"
|
||||
else S::consumeAndProduceZ.callSuspend(s, Z("OK")).value
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_REFLECT
|
||||
|
||||
package test
|
||||
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
inline class Z(val value: String)
|
||||
|
||||
class S {
|
||||
suspend fun consumeZ(z: Z) {}
|
||||
suspend fun produceZ(): Z = Z("")
|
||||
suspend fun consumeAndProduceZ(z: Z): Z = z
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val members = S::class.members.filterIsInstance<KFunction<*>>().associateBy(KFunction<*>::name)
|
||||
|
||||
members["consumeZ"]!!.let { cz ->
|
||||
val czj = cz.javaMethod!!
|
||||
assertTrue(czj.name.startsWith("consumeZ-"), czj.name)
|
||||
assertEquals("java.lang.String, kotlin.coroutines.Continuation", czj.parameterTypes.joinToString { it.name })
|
||||
val czjk = czj.kotlinFunction
|
||||
assertEquals(cz, czjk)
|
||||
}
|
||||
|
||||
members["produceZ"]!!.let { pz ->
|
||||
val pzj = pz.javaMethod!!
|
||||
assertTrue(pzj.name.startsWith("produceZ-"), pzj.name)
|
||||
assertEquals("kotlin.coroutines.Continuation", pzj.parameterTypes.joinToString { it.name })
|
||||
val pzjk = pzj!!.kotlinFunction
|
||||
assertEquals(pz, pzjk)
|
||||
}
|
||||
|
||||
members["consumeAndProduceZ"]!!.let { cpz ->
|
||||
val cpzj = cpz.javaMethod!!
|
||||
assertTrue(cpzj.name.startsWith("consumeAndProduceZ-"), cpzj.name)
|
||||
assertEquals("java.lang.String, kotlin.coroutines.Continuation", cpzj.parameterTypes.joinToString { it.name })
|
||||
val cpzjk = cpzj!!.kotlinFunction
|
||||
assertEquals(cpz, cpzjk)
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+28
-5
@@ -28290,6 +28290,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
public void testProperties() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/properties.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendFunction.kt")
|
||||
public void testSuspendFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/suspendFunction.kt");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29188,11 +29193,6 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/functions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassPrimaryVal.kt")
|
||||
public void testInlineClassPrimaryVal() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClassPrimaryVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineReifiedFun.kt")
|
||||
public void testInlineReifiedFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineReifiedFun.kt");
|
||||
@@ -29281,6 +29281,29 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/inlineClasses")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class InlineClasses extends AbstractBlackBoxCodegenTest {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/reflection/mapping/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassPrimaryVal.kt")
|
||||
public void testInlineClassPrimaryVal() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClasses/inlineClassPrimaryVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendFunctionWithInlineClassInSignature.kt")
|
||||
public void testSuspendFunctionWithInlineClassInSignature() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/jvmStatic")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
+28
-5
@@ -25924,6 +25924,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
public void testProperties() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/properties.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendFunction.kt")
|
||||
public void testSuspendFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/suspendFunction.kt");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26822,11 +26827,6 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/functions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassPrimaryVal.kt")
|
||||
public void testInlineClassPrimaryVal() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClassPrimaryVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineReifiedFun.kt")
|
||||
public void testInlineReifiedFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineReifiedFun.kt");
|
||||
@@ -26915,6 +26915,29 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/inlineClasses")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class InlineClasses extends AbstractLightAnalysisModeTest {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/reflection/mapping/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassPrimaryVal.kt")
|
||||
public void testInlineClassPrimaryVal() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClasses/inlineClassPrimaryVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendFunctionWithInlineClassInSignature.kt")
|
||||
public void testSuspendFunctionWithInlineClassInSignature() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/jvmStatic")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
+28
-5
@@ -26519,6 +26519,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
public void testProperties() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/properties.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendFunction.kt")
|
||||
public void testSuspendFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/suspendFunction.kt");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27417,11 +27422,6 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/functions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassPrimaryVal.kt")
|
||||
public void testInlineClassPrimaryVal() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClassPrimaryVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineReifiedFun.kt")
|
||||
public void testInlineReifiedFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineReifiedFun.kt");
|
||||
@@ -27510,6 +27510,29 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/inlineClasses")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class InlineClasses extends AbstractIrBlackBoxCodegenTest {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/reflection/mapping/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineClassPrimaryVal.kt")
|
||||
public void testInlineClassPrimaryVal() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClasses/inlineClassPrimaryVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendFunctionWithInlineClassInSignature.kt")
|
||||
public void testSuspendFunctionWithInlineClassInSignature() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/jvmStatic")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
@@ -76,7 +76,8 @@ internal class InlineClassAwareCaller<out M : Member?>(
|
||||
else -> 0
|
||||
}
|
||||
|
||||
val extraArgumentsTail = if (isDefault) 2 else 0
|
||||
val extraArgumentsTail = (if (isDefault) 2 else 0) +
|
||||
(if (descriptor is FunctionDescriptor && descriptor.isSuspend) 1 else 0)
|
||||
|
||||
val kotlinParameterTypes: List<KotlinType> = ArrayList<KotlinType>().also { kotlinParameterTypes ->
|
||||
val extensionReceiverType = descriptor.extensionReceiverParameter?.type
|
||||
|
||||
Generated
+13
@@ -22851,6 +22851,19 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/inlineClasses")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class InlineClasses extends AbstractIrJsCodegenBoxES6Test {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS_IR_ES6, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/reflection/mapping/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/jvmStatic")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
Generated
+13
@@ -22851,6 +22851,19 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/inlineClasses")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class InlineClasses extends AbstractIrJsCodegenBoxTest {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS_IR, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/reflection/mapping/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true);
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/jvmStatic")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
+13
@@ -22866,6 +22866,19 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/inlineClasses")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class InlineClasses extends AbstractJsCodegenBoxTest {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/reflection/mapping/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true);
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/reflection/mapping/jvmStatic")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
Reference in New Issue
Block a user