diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/LocalFunctionsLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/LocalFunctionsLowering.kt index e5244947de6..c6244717116 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/LocalFunctionsLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/LocalFunctionsLowering.kt @@ -296,6 +296,14 @@ class LocalFunctionsLowering(val context: JvmBackendContext): ClassLoweringPass return newDescriptor } + private fun suggestNameForCapturedValueParameter(valueDescriptor: ValueDescriptor): Name = + if (valueDescriptor.name.isSpecial) { + val oldNameStr = valueDescriptor.name.asString() + Name.identifier("$" + oldNameStr.substring(1, oldNameStr.length - 1)) + } + else + valueDescriptor.name + private fun createUnsubstitutedCapturedValueParameter( newParameterOwner: CallableMemberDescriptor, valueDescriptor: ValueDescriptor, @@ -303,7 +311,9 @@ class LocalFunctionsLowering(val context: JvmBackendContext): ClassLoweringPass ): ValueParameterDescriptor = ValueParameterDescriptorImpl( newParameterOwner, null, index, - valueDescriptor.annotations, valueDescriptor.name, valueDescriptor.type, + valueDescriptor.annotations, + suggestNameForCapturedValueParameter(valueDescriptor), + valueDescriptor.type, false, false, false, false, null, valueDescriptor.source ) diff --git a/compiler/testData/ir/box/closureConversion4.kt b/compiler/testData/ir/box/closureConversion4.kt new file mode 100644 index 00000000000..aa59458d534 --- /dev/null +++ b/compiler/testData/ir/box/closureConversion4.kt @@ -0,0 +1,6 @@ +fun String.foo(): String { + fun bar(y: String) = this + y + return bar("K") +} + +fun box() = "O".foo() \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrOnlyBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrOnlyBoxCodegenTestGenerated.java index 66f033ee55f..c64af4bce04 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrOnlyBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrOnlyBoxCodegenTestGenerated.java @@ -59,6 +59,12 @@ public class IrOnlyBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTest doTest(fileName); } + @TestMetadata("closureConversion4.kt") + public void testClosureConversion4() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/box/closureConversion4.kt"); + doTest(fileName); + } + @TestMetadata("enumClass.kt") public void testEnumClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/box/enumClass.kt");