diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt index 642311b7fac..6bec4463b00 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.CirName import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeParameter import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirClassImpl import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap +import org.jetbrains.kotlin.descriptors.commonizer.utils.filteredSupertypes import org.jetbrains.kotlin.resolve.isInlineClass object CirClassFactory { @@ -32,7 +33,7 @@ object CirClassFactory { isInner = source.isInner, isExternal = source.isExternal ).apply { - setSupertypes(source.typeConstructor.supertypes.compactMap { CirTypeFactory.create(it) }) + setSupertypes(source.filteredSupertypes.compactMap { CirTypeFactory.create(it) }) } @Suppress("NOTHING_TO_INLINE") diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt index 17e2832692c..dabc2e380c5 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt @@ -6,9 +6,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClass -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirEntityId import org.jetbrains.kotlin.descriptors.commonizer.cir.CirType -import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeFactory import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.* import org.jetbrains.kotlin.descriptors.commonizer.utils.* import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMapNotNull @@ -98,7 +96,7 @@ internal class CommonizationVisitor( } // find out common (and commonized) supertypes - commonClass.commonizeSupertypes(node.classifierId, node.collectCommonSupertypes()) + commonClass.commonizeSupertypes(node.collectCommonSupertypes()) } } @@ -111,7 +109,7 @@ internal class CommonizationVisitor( if (commonClassifier is CirClass) { // find out common (and commonized) supertypes - commonClassifier.commonizeSupertypes(node.classifierId, node.collectCommonSupertypes()) + commonClassifier.commonizeSupertypes(node.collectCommonSupertypes()) } } @@ -144,18 +142,12 @@ internal class CommonizationVisitor( } private fun CirClass.commonizeSupertypes( - classId: CirEntityId, supertypesMap: Map>? ) { val commonSupertypes = supertypesMap?.values?.compactMapNotNull { supertypesGroup -> commonize(supertypesGroup, TypeCommonizer(classifiers)) }.orEmpty() - setSupertypes( - if (commonSupertypes.isEmpty() && classId !in SPECIAL_CLASS_WITHOUT_SUPERTYPES_CLASS_IDS) - listOf(CirTypeFactory.StandardTypes.ANY) - else - commonSupertypes - ) + setSupertypes(commonSupertypes) } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/entityBuilders.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/entityBuilders.kt index 85405edf513..bd10dbe674d 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/entityBuilders.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/metadata/entityBuilders.kt @@ -10,11 +10,13 @@ import kotlinx.metadata.klib.* import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.commonizer.cir.* +import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeFactory import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirValueParameterImpl import org.jetbrains.kotlin.descriptors.commonizer.core.computeExpandedType import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.* import org.jetbrains.kotlin.descriptors.commonizer.metadata.TypeAliasExpansion.* import org.jetbrains.kotlin.descriptors.commonizer.utils.DEFAULT_SETTER_VALUE_NAME +import org.jetbrains.kotlin.descriptors.commonizer.utils.SPECIAL_CLASS_WITHOUT_SUPERTYPES_CLASS_NAMES import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap import org.jetbrains.kotlin.types.Variance @@ -99,7 +101,12 @@ internal fun CirClass.buildClass( } clazz.companionObject = companion?.name - supertypes.mapTo(clazz.supertypes) { it.buildType(context) } + + val supertypes = supertypes + if (supertypes.isEmpty() && className !in SPECIAL_CLASS_WITHOUT_SUPERTYPES_CLASS_NAMES) + clazz.supertypes += CirTypeFactory.StandardTypes.ANY.buildType(context) + else + supertypes.mapTo(clazz.supertypes) { it.buildType(context) } } internal fun linkSealedClassesWithSubclasses(packageName: CirPackageName, classConsumer: ClassConsumer) { diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt index cb356d0d220..f36c8e1af22 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils +import kotlinx.metadata.ClassName import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor @@ -26,6 +27,9 @@ internal val SPECIAL_CLASS_WITHOUT_SUPERTYPES_CLASS_IDS: List = lis NOTHING_CLASS_ID ) +internal val SPECIAL_CLASS_WITHOUT_SUPERTYPES_CLASS_NAMES: List = + SPECIAL_CLASS_WITHOUT_SUPERTYPES_CLASS_IDS.map(CirEntityId::toString) + private val STANDARD_KOTLIN_PACKAGES: List = listOf( CirPackageName.create(StandardNames.BUILT_INS_PACKAGE_FQ_NAME), CirPackageName.create("kotlinx") diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt index 10cc5211801..f63fb0847eb 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.commonizer.cir.CirEntityId import org.jetbrains.kotlin.descriptors.commonizer.cir.CirName @@ -43,6 +44,9 @@ internal val ClassifierDescriptorWithTypeParameters.classifierId: CirEntityId internal inline val TypeParameterDescriptor.filteredUpperBounds: List get() = upperBounds.takeUnless { it.singleOrNull()?.isNullableAny() == true } ?: emptyList() +internal inline val ClassDescriptor.filteredSupertypes: Collection + get() = typeConstructor.supertypes.takeUnless { it.size == 1 && KotlinBuiltIns.isAny(it.first()) } ?: emptyList() + internal val KotlinType.signature: CirTypeSignature get() { // use of interner saves up to 95% of duplicates