[Commonizer] Don't keep kotlin/Any as the single supertype in CirClass

This commit is contained in:
Dmitriy Dolovov
2021-02-16 09:31:17 +03:00
parent baeee8988e
commit ef931d5561
5 changed files with 21 additions and 13 deletions
@@ -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")
@@ -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<CirType, CommonizedGroup<CirType>>?
) {
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)
}
}
@@ -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) {
@@ -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<CirEntityId> = lis
NOTHING_CLASS_ID
)
internal val SPECIAL_CLASS_WITHOUT_SUPERTYPES_CLASS_NAMES: List<ClassName> =
SPECIAL_CLASS_WITHOUT_SUPERTYPES_CLASS_IDS.map(CirEntityId::toString)
private val STANDARD_KOTLIN_PACKAGES: List<CirPackageName> = listOf(
CirPackageName.create(StandardNames.BUILT_INS_PACKAGE_FQ_NAME),
CirPackageName.create("kotlinx")
@@ -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<KotlinType>
get() = upperBounds.takeUnless { it.singleOrNull()?.isNullableAny() == true } ?: emptyList()
internal inline val ClassDescriptor.filteredSupertypes: Collection<KotlinType>
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