JVM IR: do not generate extension receiver parameter as ACC_MANDATED
Otherwise Java reflection is not able to load its type as a parameterized type. #KT-40857 Fixed
This commit is contained in:
committed by
Space Team
parent
d23a4f46cc
commit
47c48efa33
+6
@@ -34887,6 +34887,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
|||||||
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt40857_parameterizedExtensionReceiver.kt")
|
||||||
|
public void testKt40857_parameterizedExtensionReceiver() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("superParams.kt")
|
@TestMetadata("superParams.kt")
|
||||||
public void testSuperParams() throws Exception {
|
public void testSuperParams() throws Exception {
|
||||||
|
|||||||
+6
@@ -34887,6 +34887,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
|||||||
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt40857_parameterizedExtensionReceiver.kt")
|
||||||
|
public void testKt40857_parameterizedExtensionReceiver() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("superParams.kt")
|
@TestMetadata("superParams.kt")
|
||||||
public void testSuperParams() throws Exception {
|
public void testSuperParams() throws Exception {
|
||||||
|
|||||||
+1
-1
@@ -337,7 +337,7 @@ private fun IrValueParameter.isSyntheticMarkerParameter(): Boolean =
|
|||||||
|
|
||||||
private fun generateParameterNames(irFunction: IrFunction, mv: MethodVisitor, state: GenerationState) {
|
private fun generateParameterNames(irFunction: IrFunction, mv: MethodVisitor, state: GenerationState) {
|
||||||
irFunction.extensionReceiverParameter?.let {
|
irFunction.extensionReceiverParameter?.let {
|
||||||
mv.visitParameter(irFunction.extensionReceiverName(state), Opcodes.ACC_MANDATED)
|
mv.visitParameter(irFunction.extensionReceiverName(state), 0)
|
||||||
}
|
}
|
||||||
for (irParameter in irFunction.valueParameters) {
|
for (irParameter in irFunction.valueParameters) {
|
||||||
// A construct emitted by a Java compiler must be marked as synthetic if it does not correspond to a construct declared
|
// A construct emitted by a Java compiler must be marked as synthetic if it does not correspond to a construct declared
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
// IGNORE_BACKEND: JVM
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
// PARAMETERS_METADATA
|
// PARAMETERS_METADATA
|
||||||
@@ -15,7 +16,7 @@ fun box(): String {
|
|||||||
val method = clazz.getDeclaredMethod("test", String::class.java, String::class.java)
|
val method = clazz.getDeclaredMethod("test", String::class.java, String::class.java)
|
||||||
val parameters = method.getParameters()
|
val parameters = method.getParameters()
|
||||||
|
|
||||||
if (!parameters[0].isImplicit() || parameters[0].isSynthetic()) return "wrong modifier on receiver parameter: ${parameters[0].modifiers}"
|
if (parameters[0].isImplicit() || parameters[0].isSynthetic()) return "wrong modifier on receiver parameter: ${parameters[0].modifiers}"
|
||||||
|
|
||||||
return parameters[1].name
|
return parameters[1].name
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -1,5 +1,6 @@
|
|||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
// IGNORE_BACKEND: JVM
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
// PARAMETERS_METADATA
|
// PARAMETERS_METADATA
|
||||||
@@ -19,10 +20,8 @@ fun box(): String {
|
|||||||
|
|
||||||
val extensionMethod = Class.forName("AKt").declaredMethods.single { it.name.contains("extension") }
|
val extensionMethod = Class.forName("AKt").declaredMethods.single { it.name.contains("extension") }
|
||||||
val extensionMethodParameters = extensionMethod.getParameters()
|
val extensionMethodParameters = extensionMethod.getParameters()
|
||||||
if (extensionMethodParameters[0].isSynthetic())
|
if (extensionMethodParameters[0].isSynthetic() || extensionMethodParameters[0].isImplicit())
|
||||||
return "wrong modifier (synthetic) on extension receiver parameter: ${extensionMethodParameters[0].modifiers}"
|
return "wrong modifier on extension receiver parameter: ${extensionMethodParameters[0].modifiers}"
|
||||||
if (!extensionMethodParameters[0].isImplicit())
|
|
||||||
return "wrong modifier (not implicit) on extension receiver parameter: ${extensionMethodParameters[0].modifiers}"
|
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// SKIP_JDK6
|
||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// IGNORE_BACKEND: JVM
|
||||||
|
// WITH_STDLIB
|
||||||
|
// FULL_JDK
|
||||||
|
// PARAMETERS_METADATA
|
||||||
|
|
||||||
|
import java.lang.reflect.ParameterizedType
|
||||||
|
|
||||||
|
fun List<String>.bar(i: Int) = Unit
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val function = object {}.javaClass.enclosingClass.getDeclaredMethods().single { it.name == "bar" }
|
||||||
|
val type = function.parameters[0].parameterizedType
|
||||||
|
if (type !is ParameterizedType || type.toString() != "java.util.List<java.lang.String>") return "Fail: $type ${type.javaClass}"
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+6
@@ -33483,6 +33483,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt40857_parameterizedExtensionReceiver.kt")
|
||||||
|
public void testKt40857_parameterizedExtensionReceiver() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("superParams.kt")
|
@TestMetadata("superParams.kt")
|
||||||
public void testSuperParams() throws Exception {
|
public void testSuperParams() throws Exception {
|
||||||
|
|||||||
+6
@@ -34887,6 +34887,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt40857_parameterizedExtensionReceiver.kt")
|
||||||
|
public void testKt40857_parameterizedExtensionReceiver() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("superParams.kt")
|
@TestMetadata("superParams.kt")
|
||||||
public void testSuperParams() throws Exception {
|
public void testSuperParams() throws Exception {
|
||||||
|
|||||||
+15
-10
@@ -28509,11 +28509,26 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
public static class ParametersMetadata extends AbstractLightAnalysisModeTest {
|
public static class ParametersMetadata extends AbstractLightAnalysisModeTest {
|
||||||
|
@TestMetadata("extensionFunction.kt")
|
||||||
|
public void ignoreExtensionFunction() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/parametersMetadata/extensionFunction.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassMethodParameterModifiers.kt")
|
||||||
|
public void ignoreInlineClassMethodParameterModifiers() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterModifiers.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jvmOverloads.kt")
|
@TestMetadata("jvmOverloads.kt")
|
||||||
public void ignoreJvmOverloads() throws Exception {
|
public void ignoreJvmOverloads() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
runTest("compiler/testData/codegen/box/parametersMetadata/jvmOverloads.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt40857_parameterizedExtensionReceiver.kt")
|
||||||
|
public void ignoreKt40857_parameterizedExtensionReceiver() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt");
|
||||||
|
}
|
||||||
|
|
||||||
private void runTest(String testDataFilePath) throws Exception {
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||||
}
|
}
|
||||||
@@ -28537,21 +28552,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/parametersMetadata/enum.kt");
|
runTest("compiler/testData/codegen/box/parametersMetadata/enum.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("extensionFunction.kt")
|
|
||||||
public void testExtensionFunction() throws Exception {
|
|
||||||
runTest("compiler/testData/codegen/box/parametersMetadata/extensionFunction.kt");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("function.kt")
|
@TestMetadata("function.kt")
|
||||||
public void testFunction() throws Exception {
|
public void testFunction() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/parametersMetadata/function.kt");
|
runTest("compiler/testData/codegen/box/parametersMetadata/function.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineClassMethodParameterModifiers.kt")
|
|
||||||
public void testInlineClassMethodParameterModifiers() throws Exception {
|
|
||||||
runTest("compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterModifiers.kt");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineClassMethodParameterNames.kt")
|
@TestMetadata("inlineClassMethodParameterNames.kt")
|
||||||
public void testInlineClassMethodParameterNames() throws Exception {
|
public void testInlineClassMethodParameterNames() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterNames.kt");
|
runTest("compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterNames.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user