From 9162faaf39dacd0fe101a831dcec89dc85357dfa Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Thu, 3 Mar 2022 16:53:06 +0300 Subject: [PATCH] [MPP] Fix incorrect reuse of type argument commonizer If the same NullableSingleInvocationCommonizer is reused for any reason, it will store next inputs alongside previous, which is totally not expected ^KT-51528 Fixed --- .../core/PlatformIntegerCommonizer.kt | 31 ++++++------ ...rchicalPlatformIntegerCommonizationTest.kt | 47 +++++++++++++++++++ 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PlatformIntegerCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PlatformIntegerCommonizer.kt index 650fb872e4d..e32a0bac1c1 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PlatformIntegerCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PlatformIntegerCommonizer.kt @@ -18,11 +18,9 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.utils.SmartList class PlatformIntegerCommonizer( - typeArgumentListCommonizer: TypeArgumentListCommonizer, - classifiers: CirKnownClassifiers, + private val typeCommonizer: TypeCommonizer, + private val classifiers: CirKnownClassifiers, ) : NullableSingleInvocationCommonizer { - constructor(typeCommonizer: TypeCommonizer, classifiers: CirKnownClassifiers) - : this(TypeArgumentListCommonizer(typeCommonizer), classifiers) override fun invoke(values: List): CirClassOrTypeAliasType? { return platformDependentTypeCommonizers.firstNotNullOfOrNull { commonizer -> @@ -30,18 +28,19 @@ class PlatformIntegerCommonizer( } } - private val platformDependentTypeCommonizers = listOf( - PlatformIntCommonizer(classifiers), - PlatformUIntCommonizer(classifiers), - PlatformIntArrayCommonizer(classifiers), - PlatformUIntArrayCommonizer(classifiers), - PlatformIntRangeCommonizer(classifiers), - PlatformUIntRangeCommonizer(classifiers), - PlatformIntProgressionCommonizer(classifiers), - PlatformUIntProgressionCommonizer(classifiers), - PlatformIntVarOfCommonizer(classifiers, typeArgumentListCommonizer), - PlatformUIntVarOfCommonizer(classifiers, typeArgumentListCommonizer), - ) + private val platformDependentTypeCommonizers: List + get() = listOf( + PlatformIntCommonizer(classifiers), + PlatformUIntCommonizer(classifiers), + PlatformIntArrayCommonizer(classifiers), + PlatformUIntArrayCommonizer(classifiers), + PlatformIntRangeCommonizer(classifiers), + PlatformUIntRangeCommonizer(classifiers), + PlatformIntProgressionCommonizer(classifiers), + PlatformUIntProgressionCommonizer(classifiers), + PlatformIntVarOfCommonizer(classifiers, TypeArgumentListCommonizer(typeCommonizer)), + PlatformUIntVarOfCommonizer(classifiers, TypeArgumentListCommonizer(typeCommonizer)), + ) } private sealed class PlatformDependentTypeCommonizer( diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalPlatformIntegerCommonizationTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalPlatformIntegerCommonizationTest.kt index fb8c159ab5f..42264a67e5e 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalPlatformIntegerCommonizationTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalPlatformIntegerCommonizationTest.kt @@ -671,4 +671,51 @@ class HierarchicalPlatformIntegerCommonizationTest : AbstractInlineSourcesCommon "(unknown, ${IOS_ARM32.name})", "".trimIndent() ) } + + // Issue: KT-51528 + fun `test multiple argument function with over the edge type alias available`() { + val result = commonize { + outputTarget("(${IOS_ARM32.name}, ${IOS_ARM64.name})") + setting(PlatformIntegerCommonizationEnabledKey, true) + registerFakeStdlibIntegersDependency("(${IOS_ARM32.name}, ${IOS_ARM64.name})") + + IOS_ARM32.name withSource """ + typealias Arm32Alias = UInt + typealias OtherAlias = UInt + + class Box + + fun fn( + arg1: Box>, + arg2: Box> + ) {} + """.trimIndent() + + IOS_ARM64.name withSource """ + typealias Arm64Alias = ULong + typealias OtherAlias = ULong + + class Box + + fun fn( + arg1: Box>, + arg2: Box> + ) {} + """.trimIndent() + } + + result.assertCommonized( + "(${IOS_ARM32.name}, ${IOS_ARM64.name})", """ + @UnsafeNumber(["${IOS_ARM32.name}: kotlin.UInt", "${IOS_ARM64.name}: kotlin.ULong"]) + typealias OtherAlias = PlatformUInt + + expect class Box() + + expect fun fn( + arg1: Box>, + arg2: Box> + ) + """.trimIndent() + ) + } }