From 47c48efa33d880d74c39a94b42e504b8721834bc Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 28 Feb 2023 23:30:23 +0100 Subject: [PATCH] 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 --- ...LightTreeBlackBoxCodegenTestGenerated.java | 6 +++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 +++++ .../backend/jvm/codegen/FunctionCodegen.kt | 2 +- .../parametersMetadata/extensionFunction.kt | 3 ++- .../inlineClassMethodParameterModifiers.kt | 7 +++--- .../kt40857_parameterizedExtensionReceiver.kt | 17 +++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 25 +++++++++++-------- 9 files changed, 62 insertions(+), 16 deletions(-) create mode 100644 compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index f963b8da042..88aeabd49da 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -34887,6 +34887,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr 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 @TestMetadata("superParams.kt") public void testSuperParams() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 302f63fc700..c3584cb2ce7 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -34887,6 +34887,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo 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 @TestMetadata("superParams.kt") public void testSuperParams() throws Exception { diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index e6c7fcaeb2d..ce76bbaecc5 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -337,7 +337,7 @@ private fun IrValueParameter.isSyntheticMarkerParameter(): Boolean = private fun generateParameterNames(irFunction: IrFunction, mv: MethodVisitor, state: GenerationState) { irFunction.extensionReceiverParameter?.let { - mv.visitParameter(irFunction.extensionReceiverName(state), Opcodes.ACC_MANDATED) + mv.visitParameter(irFunction.extensionReceiverName(state), 0) } 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 diff --git a/compiler/testData/codegen/box/parametersMetadata/extensionFunction.kt b/compiler/testData/codegen/box/parametersMetadata/extensionFunction.kt index 3f38e8e81c1..b56f265fd43 100644 --- a/compiler/testData/codegen/box/parametersMetadata/extensionFunction.kt +++ b/compiler/testData/codegen/box/parametersMetadata/extensionFunction.kt @@ -1,5 +1,6 @@ // SKIP_JDK6 // TARGET_BACKEND: JVM +// IGNORE_BACKEND: JVM // WITH_STDLIB // FULL_JDK // PARAMETERS_METADATA @@ -15,7 +16,7 @@ fun box(): String { val method = clazz.getDeclaredMethod("test", String::class.java, String::class.java) 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 } diff --git a/compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterModifiers.kt b/compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterModifiers.kt index b2c334d32eb..d8c80d38ee2 100644 --- a/compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterModifiers.kt +++ b/compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterModifiers.kt @@ -1,5 +1,6 @@ // SKIP_JDK6 // TARGET_BACKEND: JVM +// IGNORE_BACKEND: JVM // WITH_STDLIB // FULL_JDK // PARAMETERS_METADATA @@ -19,10 +20,8 @@ fun box(): String { val extensionMethod = Class.forName("AKt").declaredMethods.single { it.name.contains("extension") } val extensionMethodParameters = extensionMethod.getParameters() - if (extensionMethodParameters[0].isSynthetic()) - return "wrong modifier (synthetic) on extension receiver parameter: ${extensionMethodParameters[0].modifiers}" - if (!extensionMethodParameters[0].isImplicit()) - return "wrong modifier (not implicit) on extension receiver parameter: ${extensionMethodParameters[0].modifiers}" + if (extensionMethodParameters[0].isSynthetic() || extensionMethodParameters[0].isImplicit()) + return "wrong modifier on extension receiver parameter: ${extensionMethodParameters[0].modifiers}" return "OK" } diff --git a/compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt b/compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt new file mode 100644 index 00000000000..98100cf892d --- /dev/null +++ b/compiler/testData/codegen/box/parametersMetadata/kt40857_parameterizedExtensionReceiver.kt @@ -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.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") return "Fail: $type ${type.javaClass}" + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 6753f3e2e0f..800237d1d98 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -33483,6 +33483,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { 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 @TestMetadata("superParams.kt") public void testSuperParams() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 0b67d2148b9..ada1b2cae19 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -34887,6 +34887,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes 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 @TestMetadata("superParams.kt") public void testSuperParams() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 52aafb0ede3..20ebb557773 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -28509,11 +28509,26 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) 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") public void ignoreJvmOverloads() throws Exception { 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 { KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); } @@ -28537,21 +28552,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes 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") public void testFunction() throws Exception { 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") public void testInlineClassMethodParameterNames() throws Exception { runTest("compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterNames.kt");