From f9f948fea6c5ed7108255be6bf93eaccfa75295a Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 3 Mar 2021 12:01:16 +0500 Subject: [PATCH] [IR] Fixed problems with nested inline classes Fixes https://youtrack.jetbrains.com/issue/KT-45139 as well (cherry picked from commit 44916e39bfa69325a9ab73cb4533bd2612fb4e56) --- .../jetbrains/kotlin/backend/konan/Boxing.kt | 24 ++++++++++++++----- .../backend.native/tests/build.gradle | 4 ++++ .../inlineClass/nestedInlineClasses.kt | 21 ++++++++++++++++ 3 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 kotlin-native/backend.native/tests/codegen/inlineClass/nestedInlineClasses.kt diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Boxing.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Boxing.kt index ab95d0aa999..325f6f03b46 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Boxing.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Boxing.kt @@ -42,8 +42,14 @@ private fun KonanSymbols.getTypeConversionImpl( internal object DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION : IrDeclarationOriginImpl("INLINE_CLASS_SPECIAL_FUNCTION") internal val Context.getBoxFunction: (IrClass) -> IrSimpleFunction by Context.lazyMapMember { inlinedClass -> - assert(inlinedClass.isUsedAsBoxClass()) - assert(inlinedClass.parent is IrFile) { "Expected top level inline class" } + require(inlinedClass.isUsedAsBoxClass()) + val classes = mutableListOf(inlinedClass) + var parent = inlinedClass.parent + while (parent is IrClass) { + classes.add(parent) + parent = parent.parent + } + require(parent is IrFile) { "Local inline classes are not supported" } val symbols = ir.symbols @@ -61,7 +67,7 @@ internal val Context.getBoxFunction: (IrClass) -> IrSimpleFunction by Context.la startOffset, endOffset, DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION, IrSimpleFunctionSymbolImpl(), - Name.special("<${inlinedClass.name}-box>"), + Name.special("<${classes.reversed().joinToString(".") { it.name.asString() }}-box>"), DescriptorVisibilities.PUBLIC, Modality.FINAL, returnType, @@ -95,8 +101,14 @@ internal val Context.getBoxFunction: (IrClass) -> IrSimpleFunction by Context.la } internal val Context.getUnboxFunction: (IrClass) -> IrSimpleFunction by Context.lazyMapMember { inlinedClass -> - assert(inlinedClass.isUsedAsBoxClass()) - assert(inlinedClass.parent is IrFile) { "Expected top level inline class" } + require(inlinedClass.isUsedAsBoxClass()) + val classes = mutableListOf(inlinedClass) + var parent = inlinedClass.parent + while (parent is IrClass) { + classes.add(parent) + parent = parent.parent + } + require(parent is IrFile) { "Local inline classes are not supported" } val symbols = ir.symbols @@ -114,7 +126,7 @@ internal val Context.getUnboxFunction: (IrClass) -> IrSimpleFunction by Context. startOffset, endOffset, DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION, IrSimpleFunctionSymbolImpl(), - Name.special("<${inlinedClass.name}-unbox>"), + Name.special("<${classes.reversed().joinToString(".") { it.name.asString() } }-unbox>"), DescriptorVisibilities.PUBLIC, Modality.FINAL, returnType, diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index ad3cb6f0d5e..fdcb0f92e22 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -3262,6 +3262,10 @@ task inlineClass_secondaryConstructorWithGenerics(type: KonanLocalTest) { source = "codegen/inlineClass/secondaryConstructorWithGenerics.kt" } +task inlineClass_nestedInlineClasses(type: KonanLocalTest) { + source = "codegen/inlineClass/nestedInlineClasses.kt" +} + task valueClass0(type: KonanLocalTest) { source = "codegen/inlineClass/valueClass0.kt" } diff --git a/kotlin-native/backend.native/tests/codegen/inlineClass/nestedInlineClasses.kt b/kotlin-native/backend.native/tests/codegen/inlineClass/nestedInlineClasses.kt new file mode 100644 index 00000000000..e343f838724 --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/inlineClass/nestedInlineClasses.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +package codegen.inlineClass.nestedInlineClasses + +import kotlin.test.* + +interface I { + inline class IC(val x: Int) +} + +interface I2 { + inline class IC(val x: Int) +} + +@Test fun runTest() { + assertEquals(42, I.IC(42).x) + assertEquals(117, I2.IC(117).x) +}