From 1f23184db9986e9fd72737765fda48a21d6144d8 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 27 Aug 2019 18:28:17 +0300 Subject: [PATCH] FIR: Get rid of code duplication in SupertypesUtils.kt --- .../kotlin/fir/resolve/SupertypeUtils.kt | 47 +++++++------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt index 84d40ddfb69..5169ea4ef1c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt @@ -9,7 +9,10 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* 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.symbols.ConeClassifierSymbol import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol @@ -24,8 +27,7 @@ fun lookupSuperTypes( useSiteSession: FirSession ): List { return mutableListOf().also { - if (lookupInterfaces) klass.symbol.collectSuperTypes(it, deep, useSiteSession) - else klass.symbol.collectSuperClasses(it, useSiteSession) + klass.symbol.collectSuperTypes(it, deep, lookupInterfaces, useSiteSession) } } @@ -106,51 +108,36 @@ private tailrec fun ConeClassLikeType.computePartialExpansion(useSiteSession: Fi } } -private tailrec fun ConeClassifierSymbol.collectSuperClasses( - list: MutableList, - 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( list: MutableList, deep: Boolean, + lookupInterfaces: Boolean, useSiteSession: FirSession ) { when (this) { is FirClassSymbol -> { val superClassTypes = - fir.superConeTypes.mapNotNull { it.computePartialExpansion(useSiteSession) } + fir.superConeTypes.mapNotNull { + it.computePartialExpansion(useSiteSession) + .takeIf { type -> lookupInterfaces || type.isClassBasedType(useSiteSession) } + } list += superClassTypes if (deep) superClassTypes.forEach { if (it !is ConeClassErrorType) { - it.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, useSiteSession) + it.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, lookupInterfaces, useSiteSession) } } } is FirTypeAliasSymbol -> { 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") } } + +private fun ConeClassLikeType?.isClassBasedType( + useSiteSession: FirSession +) = this !is ConeClassErrorType && + (this?.lookupTag?.toSymbol(useSiteSession) as? FirClassSymbol)?.fir?.classKind == ClassKind.CLASS