From 35a29acdc78e3a4d35138cc1dc9c0755e14e6182 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Fri, 10 Sep 2021 14:34:01 +0200 Subject: [PATCH] [Commonizer] Always use parent arguments for type substitution --- .../jetbrains/kotlin/commonizer/cir/utils.kt | 6 +++- .../core/ClassOrTypeAliasTypeCommonizer.kt | 2 +- ...icalOptimisticNumbersTypeCommonizerTest.kt | 2 +- .../HierarchicalTypeAliasCommonizationTest.kt | 36 +++++++++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/utils.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/utils.kt index 67b88d720e1..91d5b413a1d 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/utils.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/utils.kt @@ -95,6 +95,10 @@ internal fun CirClassOrTypeAliasType.withParentArguments( if (oldArgument is CirRegularTypeProjection) { val oldArgumentType = oldArgument.type if (oldArgumentType is CirTypeParameterType) { + when (val parentArgument = parentArguments[oldArgumentType.index]) { + is CirRegularTypeProjection -> if (parentArgument is CirClassOrTypeAliasType) return@map parentArgument + is CirStarTypeProjection -> return@map parentArgument + } return@map parentArguments[oldArgumentType.index] } } @@ -105,7 +109,7 @@ internal fun CirClassOrTypeAliasType.withParentArguments( this -> this is CirClassType -> newUnderlyingType is CirTypeAliasType -> newUnderlyingType.withUnderlyingType( - newUnderlyingType.underlyingType.withParentArguments(newArguments, newIsMarkedNullable) + newUnderlyingType.underlyingType.withParentArguments(parentArguments, newIsMarkedNullable) ) } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/ClassOrTypeAliasTypeCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/ClassOrTypeAliasTypeCommonizer.kt index 9cbaef4a06f..c7f7b704820 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/ClassOrTypeAliasTypeCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/ClassOrTypeAliasTypeCommonizer.kt @@ -113,7 +113,7 @@ internal class ClassOrTypeAliasTypeCommonizer( /* Only forward substitutions allowed -> Only substitute with any underlying type */ forwardSubstitutionAllowed -> commonId.aliases.filter { candidate -> - types.all { type -> type.isAnyUnderlyingClassifier(candidate) } + types.all { type -> candidate == type.classifierId || type.isAnyUnderlyingClassifier(candidate) } } /* Only backward substitutions allowed -> Only substitute with any typealias pointing to this types */ diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalOptimisticNumbersTypeCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalOptimisticNumbersTypeCommonizerTest.kt index f12ac9722b3..4d9ba4608f5 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalOptimisticNumbersTypeCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalOptimisticNumbersTypeCommonizerTest.kt @@ -618,7 +618,7 @@ class HierarchicalOptimisticNumbersTypeCommonizerTest : AbstractInlineSourcesCom @UnsafeNumber(["a: kotlin.Int", "b: kotlin.Long"]) typealias B = A @UnsafeNumber(["a: kotlin.Int", "b: kotlin.Long"]) - typealias X = A + typealias X = B """.trimIndent() ) } diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalTypeAliasCommonizationTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalTypeAliasCommonizationTest.kt index a33c917543f..8f8e0a311c7 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalTypeAliasCommonizationTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalTypeAliasCommonizationTest.kt @@ -162,4 +162,40 @@ class HierarchicalTypeAliasCommonizationTest : AbstractInlineSourcesCommonizatio """.trimIndent() ) } + + fun `test typealias with phantom type`() { + val result = commonize { + outputTarget("(a, b)") + + simpleSingleSourceTarget( + "a", """ + typealias A = Map + typealias B = A + typealias X = B + + fun x(x: X) = Unit + """.trimIndent() + ) + + simpleSingleSourceTarget( + "b", """ + typealias A = Map + typealias B = A + typealias X = B + typealias Y = X + fun x(x: Y) = Unit + """.trimIndent() + ) + } + + result.assertCommonized( + "(a, b)", """ + typealias A = Map + typealias B = A + typealias X = B + + expect fun x(x: X) + """.trimIndent() + ) + } }