[Commonizer] Add small documentation on CirSupertypesResolver

^KT-47430
This commit is contained in:
sebastian.sellmair
2021-08-13 09:09:29 +02:00
committed by Space
parent 9fb41b6334
commit 26ede5d885

View File

@@ -9,17 +9,21 @@ import org.jetbrains.kotlin.commonizer.mergedtree.CirClassifierIndex
import org.jetbrains.kotlin.commonizer.mergedtree.CirProvided
import org.jetbrains.kotlin.commonizer.mergedtree.CirProvidedClassifiers
import org.jetbrains.kotlin.commonizer.mergedtree.findClass
import org.jetbrains.kotlin.commonizer.util.transitiveClosure
import org.jetbrains.kotlin.descriptors.Visibilities
internal interface CirSupertypesResolver {
/**
* Resolves all *declared* supertypes (not their transitive closure)
*/
fun supertypes(type: CirClassType): Set<CirClassType>
}
internal fun CirSupertypesResolver.allSupertypes(type: CirClassType): Set<CirClassType> {
return transitiveClosure(type, this::supertypes)
}
/**
* Very simple and pragmatic implementation of [CirSupertypesResolver]
* Limitations:
* - Will not resolve parameterized types
* - Supertypes from dependencies are resolved in a "best effort" manner.
*/
internal class SimpleCirSupertypesResolver(
private val classifiers: CirClassifierIndex,
private val dependencies: CirProvidedClassifiers,
@@ -27,33 +31,33 @@ internal class SimpleCirSupertypesResolver(
override fun supertypes(type: CirClassType): Set<CirClassType> {
classifiers.findClass(type.classifierId)?.let { classifier ->
return supertypes(type, classifier)
return supertypesFromCirClass(type, classifier)
}
dependencies.classifier(type.classifierId)?.let { classifier ->
if (classifier is CirProvided.Class) {
return supertypes(type, classifier)
return supertypesFromProvidedClass(type, classifier)
}
}
return emptySet()
}
private fun supertypes(type: CirClassType, classifier: CirClass): Set<CirClassType> {
private fun supertypesFromCirClass(type: CirClassType, classifier: CirClass): Set<CirClassType> {
return classifier.supertypes.filterIsInstance<CirClassType>()
.mapNotNull { superType -> createSupertype(type, superType) }
.mapNotNull { superType -> buildSupertypeFromClassifierSupertype(type, superType) }
.toSet()
}
private fun supertypes(type: CirClassType, classifier: CirProvided.Class): Set<CirClassType> {
private fun supertypesFromProvidedClass(type: CirClassType, classifier: CirProvided.Class): Set<CirClassType> {
return classifier.supertypes.filterIsInstance<CirProvided.ClassType>()
.mapNotNull { superType -> superType.toCirClassTypeOrNull() }
.mapNotNull { superType -> createSupertype(type, superType) }
.mapNotNull { superType -> buildSupertypeFromClassifierSupertype(type, superType) }
.toSet()
}
private fun createSupertype(type: CirClassType, supertype: CirClassType): CirClassType? {
private fun buildSupertypeFromClassifierSupertype(type: CirClassType, supertype: CirClassType): CirClassType? {
if (type.arguments.isEmpty() && supertype.arguments.isEmpty()) {
return supertype
return supertype.makeNullableIfNecessary(type.isMarkedNullable)
}
return null