From 0d50ccc42dc66d52e125e26e7f56b434812d5051 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Wed, 18 Nov 2020 17:27:51 +0300 Subject: [PATCH] [Commonizer] Fix: Lost nullability in commonized type aliases --- .../commonizer/cir/factory/CirTypeFactory.kt | 20 +++++++++++++++++++ .../commonizer/core/TypeCommonizer.kt | 12 ++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt index 899c1eed888..e5585ef8b5b 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt @@ -115,6 +115,26 @@ object CirTypeFactory { ) } + fun makeNullable(classOrTypeAliasType: CirClassOrTypeAliasType): CirClassOrTypeAliasType = + if (classOrTypeAliasType.isMarkedNullable) + classOrTypeAliasType + else + when (classOrTypeAliasType) { + is CirClassType -> createClassType( + classId = classOrTypeAliasType.classifierId, + outerType = classOrTypeAliasType.outerType, + visibility = classOrTypeAliasType.visibility, + arguments = classOrTypeAliasType.arguments, + isMarkedNullable = true + ) + is CirTypeAliasType -> createTypeAliasType( + typeAliasId = classOrTypeAliasType.classifierId, + underlyingType = makeNullable(classOrTypeAliasType.underlyingType), + arguments = classOrTypeAliasType.arguments, + isMarkedNullable = true + ) + } + private fun createClassTypeWithAllOuterTypes( classDescriptor: ClassDescriptor, arguments: List, diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt index 5ab61fe96d0..ee123b61882 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt @@ -140,13 +140,19 @@ private class TypeAliasTypeCommonizer(private val cache: CirClassifiersCache) : // type alias don't needs to be commonized because it is from the standard library fun forKnownUnderlyingType(underlyingType: CirClassOrTypeAliasType) = object : CommonizedTypeAliasTypeBuilder { - override fun build(typeAliasId: ClassId, arguments: List, isMarkedNullable: Boolean) = - CirTypeFactory.createTypeAliasType( + override fun build(typeAliasId: ClassId, arguments: List, isMarkedNullable: Boolean): CirTypeAliasType { + val underlyingTypeWithProperNullability = if (isMarkedNullable && !underlyingType.isMarkedNullable) + CirTypeFactory.makeNullable(underlyingType) + else + underlyingType + + return CirTypeFactory.createTypeAliasType( typeAliasId = typeAliasId, - underlyingType = underlyingType, // TODO replace arguments??? + underlyingType = underlyingTypeWithProperNullability, // TODO replace arguments??? arguments = arguments, isMarkedNullable = isMarkedNullable ) + } } } }