Generate unique parameter names in LocalDeclarationsLowering
This commit is contained in:
+19
-8
@@ -549,6 +549,7 @@ class LocalDeclarationsLowering(
|
|||||||
oldDeclaration: IrFunction,
|
oldDeclaration: IrFunction,
|
||||||
newDeclaration: IrFunction
|
newDeclaration: IrFunction
|
||||||
) = ArrayList<IrValueParameter>(capturedValues.size + oldDeclaration.valueParameters.size).apply {
|
) = ArrayList<IrValueParameter>(capturedValues.size + oldDeclaration.valueParameters.size).apply {
|
||||||
|
val generatedNames = mutableSetOf<Name>()
|
||||||
capturedValues.mapIndexedTo(this) { i, capturedValue ->
|
capturedValues.mapIndexedTo(this) { i, capturedValue ->
|
||||||
val parameterDescriptor = WrappedValueParameterDescriptor()
|
val parameterDescriptor = WrappedValueParameterDescriptor()
|
||||||
val p = capturedValue.owner
|
val p = capturedValue.owner
|
||||||
@@ -558,7 +559,7 @@ class LocalDeclarationsLowering(
|
|||||||
if (p.descriptor is ReceiverParameterDescriptor && newDeclaration is IrConstructor)
|
if (p.descriptor is ReceiverParameterDescriptor && newDeclaration is IrConstructor)
|
||||||
BOUND_RECEIVER_PARAMETER else BOUND_VALUE_PARAMETER,
|
BOUND_RECEIVER_PARAMETER else BOUND_VALUE_PARAMETER,
|
||||||
IrValueParameterSymbolImpl(parameterDescriptor),
|
IrValueParameterSymbolImpl(parameterDescriptor),
|
||||||
suggestNameForCapturedValue(p),
|
suggestNameForCapturedValue(p, generatedNames),
|
||||||
i,
|
i,
|
||||||
p.type,
|
p.type,
|
||||||
null,
|
null,
|
||||||
@@ -665,13 +666,13 @@ class LocalDeclarationsLowering(
|
|||||||
|
|
||||||
private fun createFieldsForCapturedValues(localClassContext: LocalClassContext) {
|
private fun createFieldsForCapturedValues(localClassContext: LocalClassContext) {
|
||||||
val classDeclaration = localClassContext.declaration
|
val classDeclaration = localClassContext.declaration
|
||||||
|
val generatedNames = mutableSetOf<Name>()
|
||||||
localClassContext.closure.capturedValues.forEach { capturedValue ->
|
localClassContext.closure.capturedValues.forEach { capturedValue ->
|
||||||
|
|
||||||
val irField = createFieldForCapturedValue(
|
val irField = createFieldForCapturedValue(
|
||||||
classDeclaration.startOffset,
|
classDeclaration.startOffset,
|
||||||
classDeclaration.endOffset,
|
classDeclaration.endOffset,
|
||||||
suggestNameForCapturedValue(capturedValue.owner),
|
suggestNameForCapturedValue(capturedValue.owner, generatedNames),
|
||||||
Visibilities.PRIVATE,
|
Visibilities.PRIVATE,
|
||||||
classDeclaration,
|
classDeclaration,
|
||||||
capturedValue.owner.type
|
capturedValue.owner.type
|
||||||
@@ -689,12 +690,22 @@ class LocalDeclarationsLowering(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun suggestNameForCapturedValue(declaration: IrValueDeclaration): Name =
|
private fun Name.stripSpecialMarkers(): String =
|
||||||
if (declaration.name.isSpecial) {
|
if (isSpecial) asString().substring(1, asString().length - 1) else asString()
|
||||||
val oldNameStr = declaration.name.asString()
|
|
||||||
oldNameStr.substring(1, oldNameStr.length - 1).synthesizedName
|
private fun suggestNameForCapturedValue(declaration: IrValueDeclaration, existing: MutableSet<Name>): Name {
|
||||||
|
val base = if (declaration.name.isSpecial) {
|
||||||
|
val oldName = declaration.name.stripSpecialMarkers()
|
||||||
|
val parentName = (declaration.parent as? IrDeclarationWithName)?.name?.stripSpecialMarkers()
|
||||||
|
if (parentName != null) "$oldName$$parentName" else oldName
|
||||||
} else
|
} else
|
||||||
declaration.name.asString().synthesizedName
|
declaration.name.asString()
|
||||||
|
var chosen = base.synthesizedName
|
||||||
|
var suffix = 0
|
||||||
|
while (!existing.add(chosen))
|
||||||
|
chosen = "$base$${++suffix}".synthesizedName
|
||||||
|
return chosen
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun collectClosureForLocalDeclarations() {
|
private fun collectClosureForLocalDeclarations() {
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fun String.f(x: String): String {
|
||||||
|
fun String.g() = { this@f + this@g }()
|
||||||
|
return x.g()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = "O".f("K")
|
||||||
-2
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
|
|
||||||
// FILE: 1.kt
|
// FILE: 1.kt
|
||||||
// SKIP_INLINE_CHECK_IN: inlineFun$default
|
// SKIP_INLINE_CHECK_IN: inlineFun$default
|
||||||
package test
|
package test
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
inline fun f(g: () -> String) = g()
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
class A(val x: String) {
|
||||||
|
inner class B(val y: String) {
|
||||||
|
fun h() = f { x + y }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = A("O").B("K").h()
|
||||||
@@ -19,4 +19,10 @@ fun box(): String {
|
|||||||
|
|
||||||
// One instance of each is in kotlin.Metadata.d2
|
// One instance of each is in kotlin.Metadata.d2
|
||||||
// 1 \(X\)
|
// 1 \(X\)
|
||||||
|
|
||||||
|
// JVM_TEMPLATES
|
||||||
// 1 \(Y\)
|
// 1 \(Y\)
|
||||||
|
|
||||||
|
// JVM_IR_TEMPLATES
|
||||||
|
// 5 \(Y\)
|
||||||
|
// 4 \$this\$\(Y\)
|
||||||
|
|||||||
+5
@@ -3786,6 +3786,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureExtensionReceiverX2.kt")
|
||||||
|
public void testCaptureExtensionReceiverX2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiverX2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("capturedLocalGenericFun.kt")
|
@TestMetadata("capturedLocalGenericFun.kt")
|
||||||
public void testCapturedLocalGenericFun() throws Exception {
|
public void testCapturedLocalGenericFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
||||||
|
|||||||
+5
@@ -1799,6 +1799,11 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureThisAndOuter.kt")
|
||||||
|
public void testCaptureThisAndOuter() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/boxInline/innerClasses/captureThisAndOuter.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("innerLambda.kt")
|
@TestMetadata("innerLambda.kt")
|
||||||
public void testInnerLambda() throws Exception {
|
public void testInnerLambda() throws Exception {
|
||||||
runTest("compiler/testData/codegen/boxInline/innerClasses/innerLambda.kt");
|
runTest("compiler/testData/codegen/boxInline/innerClasses/innerLambda.kt");
|
||||||
|
|||||||
Generated
+5
@@ -1799,6 +1799,11 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureThisAndOuter.kt")
|
||||||
|
public void testCaptureThisAndOuter() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/boxInline/innerClasses/captureThisAndOuter.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("innerLambda.kt")
|
@TestMetadata("innerLambda.kt")
|
||||||
public void testInnerLambda() throws Exception {
|
public void testInnerLambda() throws Exception {
|
||||||
runTest("compiler/testData/codegen/boxInline/innerClasses/innerLambda.kt");
|
runTest("compiler/testData/codegen/boxInline/innerClasses/innerLambda.kt");
|
||||||
|
|||||||
+5
@@ -3786,6 +3786,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureExtensionReceiverX2.kt")
|
||||||
|
public void testCaptureExtensionReceiverX2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiverX2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("capturedLocalGenericFun.kt")
|
@TestMetadata("capturedLocalGenericFun.kt")
|
||||||
public void testCapturedLocalGenericFun() throws Exception {
|
public void testCapturedLocalGenericFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
||||||
|
|||||||
+5
@@ -3766,6 +3766,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureExtensionReceiverX2.kt")
|
||||||
|
public void testCaptureExtensionReceiverX2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiverX2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("capturedLocalGenericFun.kt")
|
@TestMetadata("capturedLocalGenericFun.kt")
|
||||||
public void testCapturedLocalGenericFun() throws Exception {
|
public void testCapturedLocalGenericFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
||||||
|
|||||||
+5
@@ -1799,6 +1799,11 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureThisAndOuter.kt")
|
||||||
|
public void testCaptureThisAndOuter() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/boxInline/innerClasses/captureThisAndOuter.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("innerLambda.kt")
|
@TestMetadata("innerLambda.kt")
|
||||||
public void testInnerLambda() throws Exception {
|
public void testInnerLambda() throws Exception {
|
||||||
runTest("compiler/testData/codegen/boxInline/innerClasses/innerLambda.kt");
|
runTest("compiler/testData/codegen/boxInline/innerClasses/innerLambda.kt");
|
||||||
|
|||||||
Generated
+5
@@ -1799,6 +1799,11 @@ public class IrCompileKotlinAgainstInlineKotlinTestGenerated extends AbstractIrC
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureThisAndOuter.kt")
|
||||||
|
public void testCaptureThisAndOuter() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/boxInline/innerClasses/captureThisAndOuter.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("innerLambda.kt")
|
@TestMetadata("innerLambda.kt")
|
||||||
public void testInnerLambda() throws Exception {
|
public void testInnerLambda() throws Exception {
|
||||||
runTest("compiler/testData/codegen/boxInline/innerClasses/innerLambda.kt");
|
runTest("compiler/testData/codegen/boxInline/innerClasses/innerLambda.kt");
|
||||||
|
|||||||
Generated
+5
@@ -3121,6 +3121,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureExtensionReceiverX2.kt")
|
||||||
|
public void testCaptureExtensionReceiverX2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiverX2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("capturedLocalGenericFun.kt")
|
@TestMetadata("capturedLocalGenericFun.kt")
|
||||||
public void testCapturedLocalGenericFun() throws Exception {
|
public void testCapturedLocalGenericFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
||||||
|
|||||||
+5
@@ -3121,6 +3121,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiver.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("captureExtensionReceiverX2.kt")
|
||||||
|
public void testCaptureExtensionReceiverX2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/closures/captureExtensionReceiverX2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("capturedLocalGenericFun.kt")
|
@TestMetadata("capturedLocalGenericFun.kt")
|
||||||
public void testCapturedLocalGenericFun() throws Exception {
|
public void testCapturedLocalGenericFun() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
runTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user