mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-03-10 08:31:29 +00:00
[Commonizer] Add small documentation on CirSupertypesResolver
^KT-47430
This commit is contained in:
committed by
Space
parent
9fb41b6334
commit
26ede5d885
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user