FIR: Simplify API for ensureResolved

Additional `as` casts look redundant, but it's a design issue (see KT-41421)
This commit is contained in:
Denis Zharkov
2020-08-27 13:44:49 +03:00
parent bb84dc2ed4
commit b4aef21423
3 changed files with 13 additions and 16 deletions
@@ -7,16 +7,14 @@ 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.FirResolvePhase
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
abstract class FirPhaseManager : FirSessionComponent {
abstract fun <D> ensureResolved(
symbol: AbstractFirBasedSymbol<D>,
abstract fun ensureResolved(
symbol: AbstractFirBasedSymbol<*>,
requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS
) where D : FirDeclaration, D : FirSymbolOwner<D>
)
}
internal val FirSession.phaseManager: FirPhaseManager? by FirSession.nullableSessionComponentAccessor()
@@ -6,19 +6,19 @@
package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
fun <D> AbstractFirBasedSymbol<D>.ensureResolved(
fun AbstractFirBasedSymbol<*>.ensureResolved(
requiredPhase: FirResolvePhase,
// TODO: Currently, the parameter is unused but it's needed to guarantee that all call-sites are able to supply use-site session
// TODO: Decide which one session should be used and probably get rid of the parameter if use-site session is not needed
useSiteSession: FirSession,
) where D : FirDeclaration, D : FirSymbolOwner<D> {
) {
val fir = fir as FirDeclaration
val availablePhase = fir.resolvePhase
if (availablePhase >= requiredPhase) return
val resolver = fir.session.phaseManager
@@ -27,9 +27,9 @@ fun <D> AbstractFirBasedSymbol<D>.ensureResolved(
resolver.ensureResolved(this, requiredPhase)
}
fun <D> AbstractFirBasedSymbol<D>.ensureResolvedForCalls(
fun AbstractFirBasedSymbol<*>.ensureResolvedForCalls(
useSiteSession: FirSession,
) where D : FirDeclaration, D : FirSymbolOwner<D> {
) {
val requiredPhase = when (this.fir) {
is FirFunction<*>, is FirProperty -> FirResolvePhase.CONTRACTS
else -> FirResolvePhase.STATUS
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.fir.low.level.api
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
@@ -19,15 +18,15 @@ internal class IdeFirPhaseManager(
private val lazyDeclarationResolver: FirLazyDeclarationResolver,
private val cache: ModuleFileCache
) : FirPhaseManager() {
override fun <D> ensureResolved(
symbol: AbstractFirBasedSymbol<D>,
override fun ensureResolved(
symbol: AbstractFirBasedSymbol<*>,
requiredPhase: FirResolvePhase
) where D : FirDeclaration, D : FirSymbolOwner<D> {
val result = symbol.fir
) {
val result = symbol.fir as FirDeclaration
val availablePhase = result.resolvePhase
if (availablePhase >= requiredPhase) return
// NB: we should use session from symbol here, not transformer session (important for IDE)
val provider = symbol.fir.session.firProvider
val provider = result.session.firProvider
require(provider.isPhasedFirAllowed) {
"Incorrect resolvePhase: actual: $availablePhase, expected: $requiredPhase\n For: ${symbol.fir.render()}"