JVM IR: do not attempt to mangle function expressions

For some reasons, lambdas and function expressions are represented
slightly differently in psi2ir. Lambdas are translated to a block with a
function of origin LOCAL_FUNCTION_FOR_LAMBDA and name "<anonymous>", but
function expressions are translated to a block with DEFINED function
"<no name provided>".

Tweak the condition for detecting local functions a bit, to avoid
similar situation in the future if we add some other origins for local
functions.

 #KT-48207 Fixed
This commit is contained in:
Alexander Udalov
2021-08-11 22:01:04 +02:00
parent dd3eb53904
commit d124239025
10 changed files with 51 additions and 3 deletions
@@ -18606,6 +18606,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
}
@Test
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/functionExpression.kt");
}
@Test
@TestMetadata("genericInlineClassSynthMembers.kt")
public void testGenericInlineClassSynthMembers() throws Exception {
@@ -57,11 +57,10 @@ class MemoizedInlineClassReplacements(
storageManager.createMemoizedFunctionWithNullableValues {
when {
// Don't mangle anonymous or synthetic functions
it.origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA ||
(it.isLocal && it is IrSimpleFunction && it.overriddenSymbols.isEmpty()) ||
(it.origin == IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR && it.visibility == DescriptorVisibilities.LOCAL) ||
it.isStaticInlineClassReplacement ||
it.origin.isSynthetic ||
it.origin == IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE ->
it.origin.isSynthetic ->
null
it.isInlineClassFieldGetter ->
@@ -0,0 +1,6 @@
inline fun new(init: (Z) -> Unit): Z = Z(42)
inline class Z(val value: Int)
fun box(): String =
if (new(fun(z: Z) {}).value == 42) "OK" else "Fail"
@@ -18474,6 +18474,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
}
@Test
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/functionExpression.kt");
}
@Test
@TestMetadata("genericInlineClassSynthMembers.kt")
public void testGenericInlineClassSynthMembers() throws Exception {
@@ -18606,6 +18606,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
}
@Test
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/functionExpression.kt");
}
@Test
@TestMetadata("genericInlineClassSynthMembers.kt")
public void testGenericInlineClassSynthMembers() throws Exception {
@@ -15364,6 +15364,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
}
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/functionExpression.kt");
}
@TestMetadata("genericInlineClassSynthMembers.kt")
public void testGenericInlineClassSynthMembers() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt");
@@ -13383,6 +13383,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
}
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/functionExpression.kt");
}
@TestMetadata("genericInlineClassSynthMembers.kt")
public void testGenericInlineClassSynthMembers() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt");
@@ -12789,6 +12789,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
}
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/functionExpression.kt");
}
@TestMetadata("genericInlineClassSynthMembers.kt")
public void testGenericInlineClassSynthMembers() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt");
@@ -12854,6 +12854,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
}
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/functionExpression.kt");
}
@TestMetadata("genericInlineClassSynthMembers.kt")
public void testGenericInlineClassSynthMembers() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt");
@@ -6899,6 +6899,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
}
@TestMetadata("functionExpression.kt")
public void testFunctionExpression() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/functionExpression.kt");
}
@TestMetadata("genericInlineClassSynthMembers.kt")
public void testGenericInlineClassSynthMembers() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt");