FIR: Get rid of code duplication in SupertypesUtils.kt
This commit is contained in:
@@ -9,7 +9,10 @@ import org.jetbrains.kotlin.descriptors.ClassKind
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.impl.FirClassUseSiteScope
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.impl.FirSuperTypeScope
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
|
||||||
import org.jetbrains.kotlin.fir.service
|
import org.jetbrains.kotlin.fir.service
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
||||||
@@ -24,8 +27,7 @@ fun lookupSuperTypes(
|
|||||||
useSiteSession: FirSession
|
useSiteSession: FirSession
|
||||||
): List<ConeClassLikeType> {
|
): List<ConeClassLikeType> {
|
||||||
return mutableListOf<ConeClassLikeType>().also {
|
return mutableListOf<ConeClassLikeType>().also {
|
||||||
if (lookupInterfaces) klass.symbol.collectSuperTypes(it, deep, useSiteSession)
|
klass.symbol.collectSuperTypes(it, deep, lookupInterfaces, useSiteSession)
|
||||||
else klass.symbol.collectSuperClasses(it, useSiteSession)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,51 +108,36 @@ private tailrec fun ConeClassLikeType.computePartialExpansion(useSiteSession: Fi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private tailrec fun ConeClassifierSymbol.collectSuperClasses(
|
|
||||||
list: MutableList<ConeClassLikeType>,
|
|
||||||
useSiteSession: FirSession
|
|
||||||
) {
|
|
||||||
when (this) {
|
|
||||||
is FirClassSymbol -> {
|
|
||||||
val superClassType =
|
|
||||||
fir.superConeTypes
|
|
||||||
.map { it.computePartialExpansion(useSiteSession) }
|
|
||||||
.firstOrNull {
|
|
||||||
it !is ConeClassErrorType &&
|
|
||||||
(it?.lookupTag?.toSymbol(useSiteSession) as? FirClassSymbol)?.fir?.classKind == ClassKind.CLASS
|
|
||||||
} ?: return
|
|
||||||
list += superClassType
|
|
||||||
superClassType.lookupTag.toSymbol(useSiteSession)?.collectSuperClasses(list, useSiteSession)
|
|
||||||
}
|
|
||||||
is FirTypeAliasSymbol -> {
|
|
||||||
val expansion = fir.expandedConeType?.computePartialExpansion(useSiteSession) ?: return
|
|
||||||
expansion.lookupTag.toSymbol(useSiteSession)?.collectSuperClasses(list, useSiteSession)
|
|
||||||
}
|
|
||||||
else -> error("?!id:1")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun ConeClassifierSymbol.collectSuperTypes(
|
private fun ConeClassifierSymbol.collectSuperTypes(
|
||||||
list: MutableList<ConeClassLikeType>,
|
list: MutableList<ConeClassLikeType>,
|
||||||
deep: Boolean,
|
deep: Boolean,
|
||||||
|
lookupInterfaces: Boolean,
|
||||||
useSiteSession: FirSession
|
useSiteSession: FirSession
|
||||||
) {
|
) {
|
||||||
when (this) {
|
when (this) {
|
||||||
is FirClassSymbol -> {
|
is FirClassSymbol -> {
|
||||||
val superClassTypes =
|
val superClassTypes =
|
||||||
fir.superConeTypes.mapNotNull { it.computePartialExpansion(useSiteSession) }
|
fir.superConeTypes.mapNotNull {
|
||||||
|
it.computePartialExpansion(useSiteSession)
|
||||||
|
.takeIf { type -> lookupInterfaces || type.isClassBasedType(useSiteSession) }
|
||||||
|
}
|
||||||
list += superClassTypes
|
list += superClassTypes
|
||||||
if (deep)
|
if (deep)
|
||||||
superClassTypes.forEach {
|
superClassTypes.forEach {
|
||||||
if (it !is ConeClassErrorType) {
|
if (it !is ConeClassErrorType) {
|
||||||
it.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, useSiteSession)
|
it.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, lookupInterfaces, useSiteSession)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is FirTypeAliasSymbol -> {
|
is FirTypeAliasSymbol -> {
|
||||||
val expansion = fir.expandedConeType?.computePartialExpansion(useSiteSession) ?: return
|
val expansion = fir.expandedConeType?.computePartialExpansion(useSiteSession) ?: return
|
||||||
expansion.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, useSiteSession)
|
expansion.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, lookupInterfaces, useSiteSession)
|
||||||
}
|
}
|
||||||
else -> error("?!id:1")
|
else -> error("?!id:1")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ConeClassLikeType?.isClassBasedType(
|
||||||
|
useSiteSession: FirSession
|
||||||
|
) = this !is ConeClassErrorType &&
|
||||||
|
(this?.lookupTag?.toSymbol(useSiteSession) as? FirClassSymbol)?.fir?.classKind == ClassKind.CLASS
|
||||||
|
|||||||
Reference in New Issue
Block a user