[FIR] avoid jumping from status transformer for local classes to unresolved non-local classes

We must resolve a non-local declaration before access
if we want to jump from local to it to avoid possible problems
with parallel resolution

^KT-56550
This commit is contained in:
Dmitrii Gridin
2023-05-07 17:06:50 +02:00
committed by Space Team
parent 71c66cdb01
commit ba08f2c08a
6 changed files with 482 additions and 7 deletions
@@ -190,6 +190,8 @@ abstract class AbstractFirStatusResolveTransformer(
private val designationMapForLocalClasses: Map<FirClassLikeDeclaration, FirClassLikeDeclaration?>,
private val scopeForLocalClass: FirScope?
) : FirAbstractTreeTransformer<FirResolvedDeclarationStatus?>(phase = FirResolvePhase.STATUS) {
private val isTransformerForLocalDeclarations: Boolean get() = scopeForLocalClass != null
@PrivateForInline
val classes = mutableListOf<FirClass>()
val statusResolver = FirStatusResolver(session, scopeSession)
@@ -329,7 +331,12 @@ abstract class AbstractFirStatusResolveTransformer(
private fun forceResolveStatusOfCorrespondingClass(typeRef: FirTypeRef) {
val superClassSymbol = typeRef.coneType.toSymbol(session)
superClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS.previous)
if (isTransformerForLocalDeclarations) {
superClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS)
} else {
superClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS.previous)
}
when (superClassSymbol) {
is FirRegularClassSymbol -> forceResolveStatusesOfClass(superClassSymbol.fir)
is FirTypeAliasSymbol -> forceResolveStatusOfCorrespondingClass(superClassSymbol.fir.expandedTypeRef)