From 438b2dd164ae36a585593b4c419bbd558dadc9c7 Mon Sep 17 00:00:00 2001 From: Nikita Nazarov Date: Sun, 3 Dec 2023 21:08:53 +0100 Subject: [PATCH] [K2, MPP] Actualize value class representation ^KT-63638 fixed --- ...LFirBlackBoxCodegenBasedTestGenerated.java | 6 +++ ...rsedBlackBoxCodegenBasedTestGenerated.java | 6 +++ ...LightTreeBlackBoxCodegenTestGenerated.java | 6 +++ ...hIrFakeOverrideGeneratorTestGenerated.java | 6 +++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 +++ .../common/actualizer/ExpectActualLinker.kt | 9 +++-- .../k2/basic/valueClassOfExpectClass.kt | 39 +++++++++++++++++++ 7 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java index d1d9e4f41b2..14d75f07fbb 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java @@ -35638,6 +35638,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt"); } + @Test + @TestMetadata("valueClassOfExpectClass.kt") + public void testValueClassOfExpectClass() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt"); + } + @Test @TestMetadata("valueClasses.kt") public void testValueClasses() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java index dfda0e4885d..6977f48abf7 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java @@ -35638,6 +35638,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt"); } + @Test + @TestMetadata("valueClassOfExpectClass.kt") + public void testValueClassOfExpectClass() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt"); + } + @Test @TestMetadata("valueClasses.kt") public void testValueClasses() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index d7f9e506786..ea31646e3f3 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -35229,6 +35229,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt"); } + @Test + @TestMetadata("valueClassOfExpectClass.kt") + public void testValueClassOfExpectClass() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt"); + } + @Test @TestMetadata("valueClasses.kt") public void testValueClasses() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index 1dcaaf9dc9e..85e68492a9f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -35229,6 +35229,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt"); } + @Test + @TestMetadata("valueClassOfExpectClass.kt") + public void testValueClassOfExpectClass() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt"); + } + @Test @TestMetadata("valueClasses.kt") public void testValueClasses() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index d5ad0920487..7f033cf8af3 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -35229,6 +35229,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt"); } + @Test + @TestMetadata("valueClassOfExpectClass.kt") + public void testValueClassOfExpectClass() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt"); + } + @Test @TestMetadata("valueClasses.kt") public void testValueClasses() throws Exception { diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualLinker.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualLinker.kt index 79b546dcf7d..00fdd7f31cc 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualLinker.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualLinker.kt @@ -7,10 +7,8 @@ package org.jetbrains.kotlin.backend.common.actualizer import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.* -import org.jetbrains.kotlin.ir.util.DeepCopyIrTreeWithSymbols -import org.jetbrains.kotlin.ir.util.SymbolRemapper -import org.jetbrains.kotlin.ir.util.SymbolRenamer -import org.jetbrains.kotlin.ir.util.TypeRemapper +import org.jetbrains.kotlin.ir.types.IrSimpleType +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.utils.memoryOptimizedMap internal class ActualizerSymbolRemapper(private val expectActualMap: Map) : SymbolRemapper { @@ -100,6 +98,9 @@ internal open class ActualizerVisitor(private val symbolRemapper: SymbolRemapper it.superTypes = it.superTypes.map { superType -> superType.remapType() } it.transformChildren(this, null) it.transformAnnotations(declaration) + it.valueClassRepresentation = it.valueClassRepresentation?.mapUnderlyingType { type -> + type.remapType() as? IrSimpleType ?: error("Value class underlying type is not a simple type: ${it.render()}") + } } override fun visitSimpleFunction(declaration: IrSimpleFunction) = (visitFunction(declaration) as IrSimpleFunction).also { diff --git a/compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt b/compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt new file mode 100644 index 00000000000..f4a07c34d8b --- /dev/null +++ b/compiler/testData/codegen/box/multiplatform/k2/basic/valueClassOfExpectClass.kt @@ -0,0 +1,39 @@ +// ISSUE: KT-63638 +// !LANGUAGE: +MultiPlatformProjects +// TARGET_BACKEND: JVM_IR +// WITH_STDLIB + +// MODULE: common +// TARGET_PLATFORM: Common +// FILE: expect.kt + +import kotlin.jvm.JvmInline + +class Session(val value: T) + +@JvmInline +value class SessionMutex private constructor( + private val currentSessionHolder: AtomicReference?> +) { + constructor() : this(AtomicReference(null)) + + val currentSession: T? + get() = currentSessionHolder.get()?.value +} + +expect class AtomicReference(value: V) { + fun get(): V + fun set(value: V) + fun getAndSet(value: V): V + fun compareAndSet(expect: V, newValue: V): Boolean +} + +// MODULE: main()()(common) +// FILE: actual.kt + +internal actual typealias AtomicReference = java.util.concurrent.atomic.AtomicReference + +fun box(): String { + val mutex = SessionMutex() + return "OK" +}