From 5f9d18d8bcc619ac816869e3fa00b43e67687084 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 1 Apr 2021 14:57:25 +0200 Subject: [PATCH] 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" --- .../kotlin/fir/resolve/transformers/PhaseUtils.kt | 8 +++++--- .../kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt | 8 ++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt index 4c14c018cbb..37043f3a736 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt @@ -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()?.ensureResolvedTypeDeclaration(useSiteSession) + coneTypeSafe()?.ensureResolvedTypeDeclaration(useSiteSession, requiredPhase) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt index 60768a25694..4a6a73a1129 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt @@ -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) + } /**