From 7149d08995a5a52cd407649a2991893da09f320e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 26 Apr 2021 14:45:27 +0200 Subject: [PATCH] FIR IDE: resolve supertypes before retrieving them --- .../jetbrains/kotlin/fir/resolve/SupertypeUtils.kt | 14 +++++++++++--- .../transformers/FirSupertypesResolution.kt | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt index ef7255c901d..8508b959a93 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.transformers.createSubstitutionForSupertype +import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolved import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope @@ -22,11 +23,18 @@ import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.SmartSet abstract class SupertypeSupplier { - abstract fun forClass(firClass: FirClass<*>): List + abstract fun forClass(firClass: FirClass<*>, useSiteSession: FirSession): List abstract fun expansionForTypeAlias(typeAlias: FirTypeAlias): ConeClassLikeType? object Default : SupertypeSupplier() { - override fun forClass(firClass: FirClass<*>) = firClass.superConeTypes + override fun forClass(firClass: FirClass<*>, useSiteSession: FirSession): List { + if (!firClass.isLocal) { + // for local classes the phase may not be updated till that moment + firClass.ensureResolved(FirResolvePhase.SUPER_TYPES, useSiteSession) + } + return firClass.superConeTypes + } + override fun expansionForTypeAlias(typeAlias: FirTypeAlias) = typeAlias.expandedConeType } } @@ -173,7 +181,7 @@ private fun FirClassifierSymbol<*>.collectSuperTypes( when (this) { is FirClassSymbol<*> -> { val superClassTypes = - supertypeSupplier.forClass(fir).mapNotNull { + supertypeSupplier.forClass(fir, useSiteSession).mapNotNull { it.computePartialExpansion(useSiteSession, supertypeSupplier) .takeIf { type -> lookupInterfaces || type.isClassBasedType(useSiteSession) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index 5d22966e193..592f8221548 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -370,7 +370,7 @@ private class SupertypeComputationSession { private val supertypeStatusMap = linkedMapOf, SupertypeComputationStatus>() val supertypesSupplier: SupertypeSupplier = object : SupertypeSupplier() { - override fun forClass(firClass: FirClass<*>): List { + override fun forClass(firClass: FirClass<*>, useSiteSession: FirSession): List { if (firClass.resolvePhase > FirResolvePhase.SUPER_TYPES) return firClass.superConeTypes return (getSupertypesComputationStatus(firClass) as? SupertypeComputationStatus.Computed)?.supertypeRefs?.mapNotNull { it.coneTypeSafe()