FIR IDE: resolve argument type super types & type args when checking for overridden
When we check overrides from IDE, we need to check argument types for subtyping. When checking for subtyping, we need type parameters declared in defining classes to be resolved to TYPES phase and super types to be resolved to SUPER_TYPES phase. Otherwise, they will be resolved to RAW_FIR and subtyping will throw "ISE Expected FirResolvedTypeRef with ConeKotlinType but was FirUserTypeRefImpl"
This commit is contained in:
+5
-3
@@ -64,15 +64,17 @@ fun AbstractFirBasedSymbol<*>.ensureResolvedForCalls(
|
||||
|
||||
fun ConeKotlinType.ensureResolvedTypeDeclaration(
|
||||
useSiteSession: FirSession,
|
||||
requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS,
|
||||
) {
|
||||
if (this !is ConeClassLikeType) return
|
||||
|
||||
lookupTag.toSymbol(useSiteSession)?.ensureResolved(FirResolvePhase.DECLARATIONS, useSiteSession)
|
||||
fullyExpandedType(useSiteSession).lookupTag.toSymbol(useSiteSession)?.ensureResolved(FirResolvePhase.DECLARATIONS, useSiteSession)
|
||||
lookupTag.toSymbol(useSiteSession)?.ensureResolved(requiredPhase, useSiteSession)
|
||||
fullyExpandedType(useSiteSession).lookupTag.toSymbol(useSiteSession)?.ensureResolved(requiredPhase, useSiteSession)
|
||||
}
|
||||
|
||||
fun FirTypeRef.ensureResolvedTypeDeclaration(
|
||||
useSiteSession: FirSession,
|
||||
requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS,
|
||||
) {
|
||||
coneTypeSafe<ConeKotlinType>()?.ensureResolvedTypeDeclaration(useSiteSession)
|
||||
coneTypeSafe<ConeKotlinType>()?.ensureResolvedTypeDeclaration(useSiteSession, requiredPhase)
|
||||
}
|
||||
|
||||
+6
-2
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolvedTypeDeclaration
|
||||
import org.jetbrains.kotlin.fir.typeContext
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
@@ -53,8 +54,11 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO
|
||||
else -> this
|
||||
}
|
||||
|
||||
fun isEqualTypes(candidateTypeRef: FirTypeRef, baseTypeRef: FirTypeRef, substitutor: ConeSubstitutor) =
|
||||
isEqualTypes(candidateTypeRef.coneType, baseTypeRef.coneType, substitutor)
|
||||
fun isEqualTypes(candidateTypeRef: FirTypeRef, baseTypeRef: FirTypeRef, substitutor: ConeSubstitutor): Boolean {
|
||||
candidateTypeRef.ensureResolvedTypeDeclaration(session, requiredPhase = FirResolvePhase.TYPES)
|
||||
baseTypeRef.ensureResolvedTypeDeclaration(session, requiredPhase = FirResolvePhase.TYPES)
|
||||
return isEqualTypes(candidateTypeRef.coneType, baseTypeRef.coneType, substitutor)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user