From fda4b170b5569d5af2b23a7efe3b6498884542a5 Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Fri, 11 Apr 2025 16:49:11 +0800 Subject: [PATCH] [Codegen][JVM]: Name value class field to `this` in LVT ^KT-73995 fixed --- .../jvm/MemoizedInlineClassReplacements.kt | 2 +- .../valueClass/localFunctionInMFVC.kt | 16 +++++++++ .../valueClass/localFunctionInValueClass.kt | 14 ++++++++ .../multiFieldValueClassFieldName.kt | 11 +++++++ .../valueClass/valueClassFieldName.kt | 12 +++++++ .../inlineClassMethodParameterNames.kt | 2 +- ...CheckLocalVariablesTableTestGenerated.java | 33 +++++++++++++++++++ ...CheckLocalVariablesTableTestGenerated.java | 33 +++++++++++++++++++ ...CheckLocalVariablesTableTestGenerated.java | 33 +++++++++++++++++++ 9 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInMFVC.kt create mode 100644 compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInValueClass.kt create mode 100644 compiler/testData/checkLocalVariablesTable/valueClass/multiFieldValueClassFieldName.kt create mode 100644 compiler/testData/checkLocalVariablesTable/valueClass/valueClassFieldName.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt index 8ad314f046a04..ed393f37425ef 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt @@ -187,7 +187,7 @@ class MemoizedInlineClassReplacements( // FAKE_OVERRIDEs have broken dispatch receivers function.parentAsClass.thisReceiver!!.copyTo( this, - name = Name.identifier("arg0"), + name = Name.identifier("\$this-" + function.parentAsClass.inlineClassFieldName), type = function.parentAsClass.defaultType, origin = IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER, kind = IrParameterKind.Regular, ) diff --git a/compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInMFVC.kt b/compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInMFVC.kt new file mode 100644 index 0000000000000..ee98b602dc2c9 --- /dev/null +++ b/compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInMFVC.kt @@ -0,0 +1,16 @@ +// LANGUAGE: +ValueClasses +// WITH_STDLIB + +@JvmInline +value class MFVC(val a: Boolean, val b:Int) { + fun foo() { + fun bar() { + a + b + } + } +} + +// METHOD : MFVC.foo_impl$bar(ZI)V +// VARIABLE : NAME=$$dispatchReceiver-a TYPE=Z INDEX=0 +// VARIABLE : NAME=$$dispatchReceiver-b TYPE=I INDEX=1 diff --git a/compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInValueClass.kt b/compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInValueClass.kt new file mode 100644 index 0000000000000..9ee2a713f6213 --- /dev/null +++ b/compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInValueClass.kt @@ -0,0 +1,14 @@ +// WITH_STDLIB + +@JvmInline +value class InlineClassTest(val a: Boolean) { + fun foo() { + fun bar() { + a + } + val arg0 = 42 + } +} + +// METHOD : InlineClassTest.foo_impl$bar(Z)V +// VARIABLE : NAME=$$this-a TYPE=Z INDEX=0 \ No newline at end of file diff --git a/compiler/testData/checkLocalVariablesTable/valueClass/multiFieldValueClassFieldName.kt b/compiler/testData/checkLocalVariablesTable/valueClass/multiFieldValueClassFieldName.kt new file mode 100644 index 0000000000000..dcaf66964bc26 --- /dev/null +++ b/compiler/testData/checkLocalVariablesTable/valueClass/multiFieldValueClassFieldName.kt @@ -0,0 +1,11 @@ +// LANGUAGE: +ValueClasses +// WITH_STDLIB + +@JvmInline +value class MFVC(val a: Boolean, val b:Int) { + fun foo() {} +} + +// METHOD : MFVC.foo-impl(ZI)V +// VARIABLE : NAME=$dispatchReceiver-a TYPE=Z INDEX=0 +// VARIABLE : NAME=$dispatchReceiver-b TYPE=I INDEX=1 diff --git a/compiler/testData/checkLocalVariablesTable/valueClass/valueClassFieldName.kt b/compiler/testData/checkLocalVariablesTable/valueClass/valueClassFieldName.kt new file mode 100644 index 0000000000000..c5ce3c6656b6d --- /dev/null +++ b/compiler/testData/checkLocalVariablesTable/valueClass/valueClassFieldName.kt @@ -0,0 +1,12 @@ +// WITH_STDLIB + +@JvmInline +value class InlineClassTest(val a: Boolean) { + fun foo() { + val arg0 = 42 + } +} + +// METHOD : InlineClassTest.foo-impl(Z)V +// VARIABLE : NAME=$this-a TYPE=Z INDEX=0 +// VARIABLE : NAME=arg0 TYPE=I INDEX=1 diff --git a/compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterNames.kt b/compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterNames.kt index a8a390eecd869..d1c0327ea7794 100644 --- a/compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterNames.kt +++ b/compiler/testData/codegen/box/parametersMetadata/inlineClassMethodParameterNames.kt @@ -15,7 +15,7 @@ fun A.bar() = this.i fun box(): String { val method = Class.forName("A").declaredMethods.single { it.name == "foo-impl" } val parameters = method.getParameters() - if (parameters[0].name != "arg0") return "wrong name on receiver parameter: ${parameters[0].name}" + if (parameters[0].name != "\$this-i") return "wrong name on receiver parameter: ${parameters[0].name}" if (parameters[1].name != "v") return "wrong name on actual parameter: ${parameters[1].name}" val extensionMethod = Class.forName("AKt").declaredMethods.single { it.name.startsWith("bar") } diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/fir/FirLightTreeCheckLocalVariablesTableTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/fir/FirLightTreeCheckLocalVariablesTableTestGenerated.java index 499af311b6c98..374bf05121888 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/fir/FirLightTreeCheckLocalVariablesTableTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/fir/FirLightTreeCheckLocalVariablesTableTestGenerated.java @@ -132,4 +132,37 @@ public void testParameters() { runTest("compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/parameters.kt"); } } + + @TestMetadata("compiler/testData/checkLocalVariablesTable/valueClass") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ValueClass extends AbstractFirLightTreeCheckLocalVariablesTableTest { + private void runTest(String testDataFilePath) { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath); + } + + public void testAllFilesPresentInValueClass() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/checkLocalVariablesTable/valueClass"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @TestMetadata("localFunctionInMFVC.kt") + public void testLocalFunctionInMFVC() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInMFVC.kt"); + } + + @TestMetadata("localFunctionInValueClass.kt") + public void testLocalFunctionInValueClass() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInValueClass.kt"); + } + + @TestMetadata("multiFieldValueClassFieldName.kt") + public void testMultiFieldValueClassFieldName() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/multiFieldValueClassFieldName.kt"); + } + + @TestMetadata("valueClassFieldName.kt") + public void testValueClassFieldName() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/valueClassFieldName.kt"); + } + } } diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/fir/FirPsiCheckLocalVariablesTableTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/fir/FirPsiCheckLocalVariablesTableTestGenerated.java index e43dbef632543..3674141ae2246 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/fir/FirPsiCheckLocalVariablesTableTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/fir/FirPsiCheckLocalVariablesTableTestGenerated.java @@ -132,4 +132,37 @@ public void testParameters() { runTest("compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/parameters.kt"); } } + + @TestMetadata("compiler/testData/checkLocalVariablesTable/valueClass") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ValueClass extends AbstractFirPsiCheckLocalVariablesTableTest { + private void runTest(String testDataFilePath) { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath); + } + + public void testAllFilesPresentInValueClass() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/checkLocalVariablesTable/valueClass"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @TestMetadata("localFunctionInMFVC.kt") + public void testLocalFunctionInMFVC() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInMFVC.kt"); + } + + @TestMetadata("localFunctionInValueClass.kt") + public void testLocalFunctionInValueClass() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInValueClass.kt"); + } + + @TestMetadata("multiFieldValueClassFieldName.kt") + public void testMultiFieldValueClassFieldName() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/multiFieldValueClassFieldName.kt"); + } + + @TestMetadata("valueClassFieldName.kt") + public void testValueClassFieldName() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/valueClassFieldName.kt"); + } + } } diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCheckLocalVariablesTableTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCheckLocalVariablesTableTestGenerated.java index 160073b4eab4c..f23622236f188 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCheckLocalVariablesTableTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCheckLocalVariablesTableTestGenerated.java @@ -132,4 +132,37 @@ public void testParameters() { runTest("compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/parameters.kt"); } } + + @TestMetadata("compiler/testData/checkLocalVariablesTable/valueClass") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ValueClass extends AbstractIrCheckLocalVariablesTableTest { + private void runTest(String testDataFilePath) { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath); + } + + public void testAllFilesPresentInValueClass() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/checkLocalVariablesTable/valueClass"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @TestMetadata("localFunctionInMFVC.kt") + public void testLocalFunctionInMFVC() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInMFVC.kt"); + } + + @TestMetadata("localFunctionInValueClass.kt") + public void testLocalFunctionInValueClass() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/localFunctionInValueClass.kt"); + } + + @TestMetadata("multiFieldValueClassFieldName.kt") + public void testMultiFieldValueClassFieldName() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/multiFieldValueClassFieldName.kt"); + } + + @TestMetadata("valueClassFieldName.kt") + public void testValueClassFieldName() { + runTest("compiler/testData/checkLocalVariablesTable/valueClass/valueClassFieldName.kt"); + } + } }