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:
Ilya Kirillov
2021-04-01 14:57:25 +02:00
parent 5ceec858aa
commit 5f9d18d8bc
2 changed files with 11 additions and 5 deletions
@@ -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)
}
@@ -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)
}
/**