FIR: Prepare refactoring of phasedFir

- Rename PhasedFirFileResolver -> FirPhaseManager
- Move semantically significant parts to a component
This commit is contained in:
Denis Zharkov
2020-08-26 10:11:19 +03:00
parent 7fe02238ea
commit 2529f541ba
5 changed files with 53 additions and 44 deletions
@@ -7,12 +7,16 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
abstract class PhasedFirFileResolver : FirSessionComponent {
abstract fun resolveDeclaration(declaration: FirDeclaration, fromPhase: FirResolvePhase, toPhase: FirResolvePhase)
abstract class FirPhaseManager : FirSessionComponent {
abstract fun <D> ensureResolved(
symbol: AbstractFirBasedSymbol<D>,
requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS
) where D : FirDeclaration, D : FirSymbolOwner<D>
}
internal val FirSession.phasedFirFileResolver: PhasedFirFileResolver? by FirSession.nullableSessionComponentAccessor()
internal val FirSession.phaseManager: FirPhaseManager? by FirSession.nullableSessionComponentAccessor()
@@ -8,29 +8,17 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
fun <D> AbstractFirBasedSymbol<D>.phasedFir(
requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS
): D where D : FirDeclaration, D : FirSymbolOwner<D> {
val result = this.fir
val availablePhase = result.resolvePhase
if (availablePhase < requiredPhase) {
// NB: we should use session from symbol here, not transformer session (important for IDE)
val provider = fir.session.firProvider
val resolver = fir.session.phaseManager
?: error("phasedFirFileResolver should be defined when working with FIR in phased mode")
require(provider.isPhasedFirAllowed) {
"Incorrect resolvePhase: actual: $availablePhase, expected: $requiredPhase\n For: ${fir.render()}"
}
resolver.ensureResolved(this, requiredPhase)
val resolver = fir.session.phasedFirFileResolver
?: error("phasedFirFileResolver should be defined when working with FIR in phased mode")
resolver.resolveDeclaration(fir, fromPhase = availablePhase, toPhase = requiredPhase)
}
return result
}