FIR: Prepare refactoring of phasedFir
- Rename PhasedFirFileResolver -> FirPhaseManager - Move semantically significant parts to a component
This commit is contained in:
+8
-4
@@ -7,12 +7,16 @@ package org.jetbrains.kotlin.fir.resolve.transformers
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
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.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
|
|
||||||
abstract class PhasedFirFileResolver : FirSessionComponent {
|
abstract class FirPhaseManager : FirSessionComponent {
|
||||||
abstract fun resolveDeclaration(declaration: FirDeclaration, fromPhase: FirResolvePhase, toPhase: FirResolvePhase)
|
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()
|
||||||
+3
-15
@@ -8,29 +8,17 @@ package org.jetbrains.kotlin.fir.resolve.transformers
|
|||||||
import org.jetbrains.kotlin.fir.FirSymbolOwner
|
import org.jetbrains.kotlin.fir.FirSymbolOwner
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
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.AbstractFirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
|
||||||
|
|
||||||
fun <D> AbstractFirBasedSymbol<D>.phasedFir(
|
fun <D> AbstractFirBasedSymbol<D>.phasedFir(
|
||||||
requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS
|
requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS
|
||||||
): D where D : FirDeclaration, D : FirSymbolOwner<D> {
|
): D where D : FirDeclaration, D : FirSymbolOwner<D> {
|
||||||
val result = this.fir
|
val result = this.fir
|
||||||
val availablePhase = result.resolvePhase
|
val resolver = fir.session.phaseManager
|
||||||
if (availablePhase < requiredPhase) {
|
?: error("phasedFirFileResolver should be defined when working with FIR in phased mode")
|
||||||
// NB: we should use session from symbol here, not transformer session (important for IDE)
|
|
||||||
val provider = fir.session.firProvider
|
|
||||||
|
|
||||||
require(provider.isPhasedFirAllowed) {
|
resolver.ensureResolved(this, requiredPhase)
|
||||||
"Incorrect resolvePhase: actual: $availablePhase, expected: $requiredPhase\n For: ${fir.render()}"
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.firProvider
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseManager
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver
|
||||||
|
|
||||||
|
internal class IdeFirPhaseManager(
|
||||||
|
private val lazyDeclarationResolver: FirLazyDeclarationResolver,
|
||||||
|
private val cache: ModuleFileCache
|
||||||
|
) : FirPhaseManager() {
|
||||||
|
override fun <D> ensureResolved(
|
||||||
|
symbol: AbstractFirBasedSymbol<D>,
|
||||||
|
requiredPhase: FirResolvePhase
|
||||||
|
) where D : FirDeclaration, D : FirSymbolOwner<D> {
|
||||||
|
val result = symbol.fir
|
||||||
|
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
|
||||||
|
|
||||||
|
require(provider.isPhasedFirAllowed) {
|
||||||
|
"Incorrect resolvePhase: actual: $availablePhase, expected: $requiredPhase\n For: ${symbol.fir.render()}"
|
||||||
|
}
|
||||||
|
|
||||||
|
lazyDeclarationResolver.lazyResolveDeclaration(result, cache, requiredPhase, checkPCE = false)
|
||||||
|
}
|
||||||
|
}
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.fir.low.level.api
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.PhasedFirFileResolver
|
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
|
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver
|
|
||||||
|
|
||||||
internal class IdePhasedFirFileResolver(
|
|
||||||
private val lazyDeclarationResolver: FirLazyDeclarationResolver,
|
|
||||||
private val cache: ModuleFileCache
|
|
||||||
) : PhasedFirFileResolver() {
|
|
||||||
override fun resolveDeclaration(declaration: FirDeclaration, fromPhase: FirResolvePhase, toPhase: FirResolvePhase) {
|
|
||||||
lazyDeclarationResolver.lazyResolveDeclaration(declaration, cache, toPhase, checkPCE = false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+4
-4
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider
|
|||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
|
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.PhasedFirFileResolver
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseManager
|
||||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||||
import org.jetbrains.kotlin.fir.session.registerCommonComponents
|
import org.jetbrains.kotlin.fir.session.registerCommonComponents
|
||||||
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.fir.session.registerResolveComponents
|
|||||||
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider
|
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
|
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.IdePhasedFirFileResolver
|
import org.jetbrains.kotlin.idea.fir.low.level.api.IdeFirPhaseManager
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.IdeSessionComponents
|
import org.jetbrains.kotlin.idea.fir.low.level.api.IdeSessionComponents
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
|
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCacheImpl
|
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCacheImpl
|
||||||
@@ -57,7 +57,7 @@ internal object FirIdeSessionFactory {
|
|||||||
val searchScope = ModuleWithDependentsScope(project, dependentModules.map { it.module })
|
val searchScope = ModuleWithDependentsScope(project, dependentModules.map { it.module })
|
||||||
return FirIdeSourcesSession(moduleInfo, sessionProvider, searchScope, firBuilder).apply {
|
return FirIdeSourcesSession(moduleInfo, sessionProvider, searchScope, firBuilder).apply {
|
||||||
val cache = ModuleFileCacheImpl(this)
|
val cache = ModuleFileCacheImpl(this)
|
||||||
val phasedFirFileResolver = IdePhasedFirFileResolver(FirLazyDeclarationResolver(firFileBuilder), cache)
|
val firPhaseManager = IdeFirPhaseManager(FirLazyDeclarationResolver(firFileBuilder), cache)
|
||||||
|
|
||||||
registerCommonComponents()
|
registerCommonComponents()
|
||||||
registerResolveComponents()
|
registerResolveComponents()
|
||||||
@@ -75,7 +75,7 @@ internal object FirIdeSessionFactory {
|
|||||||
register(FirProvider::class, provider)
|
register(FirProvider::class, provider)
|
||||||
register(FirIdeProvider::class, provider)
|
register(FirIdeProvider::class, provider)
|
||||||
|
|
||||||
register(PhasedFirFileResolver::class, phasedFirFileResolver)
|
register(FirPhaseManager::class, firPhaseManager)
|
||||||
|
|
||||||
register(
|
register(
|
||||||
FirSymbolProvider::class,
|
FirSymbolProvider::class,
|
||||||
|
|||||||
Reference in New Issue
Block a user