[FIR IDE] Fix unresolved supertype for typealiases
This commit is contained in:
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.utils.SmartSet
|
|||||||
|
|
||||||
abstract class SupertypeSupplier {
|
abstract class SupertypeSupplier {
|
||||||
abstract fun forClass(firClass: FirClass<*>, useSiteSession: FirSession): List<ConeClassLikeType>
|
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() {
|
object Default : SupertypeSupplier() {
|
||||||
override fun forClass(firClass: FirClass<*>, useSiteSession: FirSession): List<ConeClassLikeType> {
|
override fun forClass(firClass: FirClass<*>, useSiteSession: FirSession): List<ConeClassLikeType> {
|
||||||
@@ -35,7 +35,10 @@ abstract class SupertypeSupplier {
|
|||||||
return firClass.superConeTypes
|
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(
|
private fun ConeClassLikeType.computePartialExpansion(
|
||||||
useSiteSession: FirSession,
|
useSiteSession: FirSession,
|
||||||
supertypeSupplier: SupertypeSupplier
|
supertypeSupplier: SupertypeSupplier
|
||||||
): ConeClassLikeType = fullyExpandedType(useSiteSession, supertypeSupplier::expansionForTypeAlias)
|
): ConeClassLikeType = fullyExpandedType(useSiteSession) { supertypeSupplier.expansionForTypeAlias(it, useSiteSession) }
|
||||||
|
|
||||||
private fun FirClassifierSymbol<*>.collectSuperTypes(
|
private fun FirClassifierSymbol<*>.collectSuperTypes(
|
||||||
list: MutableList<ConeClassLikeType>,
|
list: MutableList<ConeClassLikeType>,
|
||||||
@@ -217,8 +220,10 @@ private fun FirClassifierSymbol<*>.collectSuperTypes(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
is FirTypeAliasSymbol -> {
|
is FirTypeAliasSymbol -> {
|
||||||
val expansion =
|
val expansion = supertypeSupplier
|
||||||
supertypeSupplier.expansionForTypeAlias(fir)?.computePartialExpansion(useSiteSession, supertypeSupplier) ?: return
|
.expansionForTypeAlias(fir, useSiteSession)
|
||||||
|
?.computePartialExpansion(useSiteSession, supertypeSupplier)
|
||||||
|
?: return
|
||||||
expansion.lookupTag.toSymbol(useSiteSession)
|
expansion.lookupTag.toSymbol(useSiteSession)
|
||||||
?.collectSuperTypes(list, visitedSymbols, deep, lookupInterfaces, substituteSuperTypes, useSiteSession, supertypeSupplier)
|
?.collectSuperTypes(list, visitedSymbols, deep, lookupInterfaces, substituteSuperTypes, useSiteSession, supertypeSupplier)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ import org.jetbrains.kotlin.fir.utils.component2
|
|||||||
|
|
||||||
fun ConeClassLikeType.fullyExpandedType(
|
fun ConeClassLikeType.fullyExpandedType(
|
||||||
useSiteSession: FirSession,
|
useSiteSession: FirSession,
|
||||||
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType,
|
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = { alias ->
|
||||||
|
alias.ensureResolved(FirResolvePhase.SUPER_TYPES, useSiteSession)
|
||||||
|
alias.expandedConeType
|
||||||
|
},
|
||||||
): ConeClassLikeType {
|
): ConeClassLikeType {
|
||||||
if (this is ConeClassLikeTypeImpl) {
|
if (this is ConeClassLikeTypeImpl) {
|
||||||
val (cachedSession, cachedExpandedType) = cachedExpandedType
|
val (cachedSession, cachedExpandedType) = cachedExpandedType
|
||||||
@@ -57,7 +60,10 @@ private fun ConeClassLikeType.fullyExpandedTypeNoCache(
|
|||||||
|
|
||||||
fun ConeClassLikeType.directExpansionType(
|
fun ConeClassLikeType.directExpansionType(
|
||||||
useSiteSession: FirSession,
|
useSiteSession: FirSession,
|
||||||
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType,
|
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = { alias ->
|
||||||
|
alias.ensureResolved(FirResolvePhase.SUPER_TYPES, useSiteSession)
|
||||||
|
alias.expandedConeType
|
||||||
|
},
|
||||||
): ConeClassLikeType? {
|
): ConeClassLikeType? {
|
||||||
val typeAliasSymbol = lookupTag.toSymbol(useSiteSession) as? FirTypeAliasSymbol ?: return null
|
val typeAliasSymbol = lookupTag.toSymbol(useSiteSession) as? FirTypeAliasSymbol ?: return null
|
||||||
val typeAlias = typeAliasSymbol.fir
|
val typeAlias = typeAliasSymbol.fir
|
||||||
|
|||||||
+1
-1
@@ -439,7 +439,7 @@ class SupertypeComputationSession {
|
|||||||
}.orEmpty()
|
}.orEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun expansionForTypeAlias(typeAlias: FirTypeAlias): ConeClassLikeType? {
|
override fun expansionForTypeAlias(typeAlias: FirTypeAlias, useSiteSession: FirSession): ConeClassLikeType? {
|
||||||
if (typeAlias.resolvePhase > FirResolvePhase.SUPER_TYPES) return typeAlias.expandedConeType
|
if (typeAlias.resolvePhase > FirResolvePhase.SUPER_TYPES) return typeAlias.expandedConeType
|
||||||
return (getSupertypesComputationStatus(typeAlias) as? SupertypeComputationStatus.Computed)
|
return (getSupertypesComputationStatus(typeAlias) as? SupertypeComputationStatus.Computed)
|
||||||
?.supertypeRefs
|
?.supertypeRefs
|
||||||
|
|||||||
+1
-4
@@ -20,10 +20,7 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
|
|
||||||
|
|
||||||
internal fun FirAnnotationCall.getClassId(session: FirSession): ClassId? =
|
internal fun FirAnnotationCall.getClassId(session: FirSession): ClassId? =
|
||||||
coneClassLikeType?.fullyExpandedType(session) { alias ->
|
coneClassLikeType?.fullyExpandedType(session)?.classId
|
||||||
alias.ensureResolved(FirResolvePhase.SUPER_TYPES, session)
|
|
||||||
alias.expandedConeType
|
|
||||||
}?.classId
|
|
||||||
|
|
||||||
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.toAnnotationsList() = withFir { fir ->
|
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.toAnnotationsList() = withFir { fir ->
|
||||||
fir.annotations.map { KtFirAnnotationCall(this, it) }
|
fir.annotations.map { KtFirAnnotationCall(this, it) }
|
||||||
|
|||||||
Reference in New Issue
Block a user