[FIR IDE] Fix unresolved supertype for typealiases

This commit is contained in:
Igor Yakovlev
2021-06-08 15:33:06 +02:00
parent 6c0bacc548
commit 4a212dc6a0
4 changed files with 20 additions and 12 deletions
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.utils.SmartSet
abstract class SupertypeSupplier {
abstract fun forClass(firClass: FirClass<*>, useSiteSession: FirSession): List<ConeClassLikeType>
abstract fun expansionForTypeAlias(typeAlias: FirTypeAlias): ConeClassLikeType?
abstract fun expansionForTypeAlias(typeAlias: FirTypeAlias, useSiteSession: FirSession): ConeClassLikeType?
object Default : SupertypeSupplier() {
override fun forClass(firClass: FirClass<*>, useSiteSession: FirSession): List<ConeClassLikeType> {
@@ -35,7 +35,10 @@ abstract class SupertypeSupplier {
return firClass.superConeTypes
}
override fun expansionForTypeAlias(typeAlias: FirTypeAlias) = typeAlias.expandedConeType
override fun expansionForTypeAlias(typeAlias: FirTypeAlias, useSiteSession: FirSession): ConeClassLikeType? {
typeAlias.ensureResolved(FirResolvePhase.SUPER_TYPES, useSiteSession)
return typeAlias.expandedConeType
}
}
}
@@ -166,7 +169,7 @@ fun ConeClassLikeType.wrapSubstitutionScopeIfNeed(
private fun ConeClassLikeType.computePartialExpansion(
useSiteSession: FirSession,
supertypeSupplier: SupertypeSupplier
): ConeClassLikeType = fullyExpandedType(useSiteSession, supertypeSupplier::expansionForTypeAlias)
): ConeClassLikeType = fullyExpandedType(useSiteSession) { supertypeSupplier.expansionForTypeAlias(it, useSiteSession) }
private fun FirClassifierSymbol<*>.collectSuperTypes(
list: MutableList<ConeClassLikeType>,
@@ -217,8 +220,10 @@ private fun FirClassifierSymbol<*>.collectSuperTypes(
}
}
is FirTypeAliasSymbol -> {
val expansion =
supertypeSupplier.expansionForTypeAlias(fir)?.computePartialExpansion(useSiteSession, supertypeSupplier) ?: return
val expansion = supertypeSupplier
.expansionForTypeAlias(fir, useSiteSession)
?.computePartialExpansion(useSiteSession, supertypeSupplier)
?: return
expansion.lookupTag.toSymbol(useSiteSession)
?.collectSuperTypes(list, visitedSymbols, deep, lookupInterfaces, substituteSuperTypes, useSiteSession, supertypeSupplier)
}
@@ -22,7 +22,10 @@ import org.jetbrains.kotlin.fir.utils.component2
fun ConeClassLikeType.fullyExpandedType(
useSiteSession: FirSession,
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType,
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = { alias ->
alias.ensureResolved(FirResolvePhase.SUPER_TYPES, useSiteSession)
alias.expandedConeType
},
): ConeClassLikeType {
if (this is ConeClassLikeTypeImpl) {
val (cachedSession, cachedExpandedType) = cachedExpandedType
@@ -57,7 +60,10 @@ private fun ConeClassLikeType.fullyExpandedTypeNoCache(
fun ConeClassLikeType.directExpansionType(
useSiteSession: FirSession,
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType,
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = { alias ->
alias.ensureResolved(FirResolvePhase.SUPER_TYPES, useSiteSession)
alias.expandedConeType
},
): ConeClassLikeType? {
val typeAliasSymbol = lookupTag.toSymbol(useSiteSession) as? FirTypeAliasSymbol ?: return null
val typeAlias = typeAliasSymbol.fir
@@ -439,7 +439,7 @@ class SupertypeComputationSession {
}.orEmpty()
}
override fun expansionForTypeAlias(typeAlias: FirTypeAlias): ConeClassLikeType? {
override fun expansionForTypeAlias(typeAlias: FirTypeAlias, useSiteSession: FirSession): ConeClassLikeType? {
if (typeAlias.resolvePhase > FirResolvePhase.SUPER_TYPES) return typeAlias.expandedConeType
return (getSupertypesComputationStatus(typeAlias) as? SupertypeComputationStatus.Computed)
?.supertypeRefs
@@ -20,10 +20,7 @@ import org.jetbrains.kotlin.name.ClassId
internal fun FirAnnotationCall.getClassId(session: FirSession): ClassId? =
coneClassLikeType?.fullyExpandedType(session) { alias ->
alias.ensureResolved(FirResolvePhase.SUPER_TYPES, session)
alias.expandedConeType
}?.classId
coneClassLikeType?.fullyExpandedType(session)?.classId
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.toAnnotationsList() = withFir { fir ->
fir.annotations.map { KtFirAnnotationCall(this, it) }