From 2529f541ba2eef543ec4246cce0633078cc1c551 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 26 Aug 2020 10:11:19 +0300 Subject: [PATCH] FIR: Prepare refactoring of phasedFir - Rename PhasedFirFileResolver -> FirPhaseManager - Move semantically significant parts to a component --- ...dFirFileResolver.kt => FirPhaseManager.kt} | 12 ++++-- .../fir/resolve/transformers/PhaseUtils.kt | 18 ++------- .../fir/low/level/api/IdeFirPhaseManager.kt | 38 +++++++++++++++++++ .../low/level/api/IdePhasedFirFileResolver.kt | 21 ---------- .../api/sessions/FirIdeSessionFactory.kt | 8 ++-- 5 files changed, 53 insertions(+), 44 deletions(-) rename compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/{PhasedFirFileResolver.kt => FirPhaseManager.kt} (50%) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdeFirPhaseManager.kt delete mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdePhasedFirFileResolver.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhasedFirFileResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirPhaseManager.kt similarity index 50% rename from compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhasedFirFileResolver.kt rename to compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirPhaseManager.kt index 44bd31cd20b..9d2d14135a0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhasedFirFileResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirPhaseManager.kt @@ -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 ensureResolved( + symbol: AbstractFirBasedSymbol, + requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS + ) where D : FirDeclaration, D : FirSymbolOwner } -internal val FirSession.phasedFirFileResolver: PhasedFirFileResolver? by FirSession.nullableSessionComponentAccessor() \ No newline at end of file +internal val FirSession.phaseManager: FirPhaseManager? by FirSession.nullableSessionComponentAccessor() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt index 54a24d28771..9c358c72f88 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt @@ -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 AbstractFirBasedSymbol.phasedFir( requiredPhase: FirResolvePhase = FirResolvePhase.DECLARATIONS ): D where D : FirDeclaration, D : FirSymbolOwner { 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 } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdeFirPhaseManager.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdeFirPhaseManager.kt new file mode 100644 index 00000000000..93292439e31 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdeFirPhaseManager.kt @@ -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 ensureResolved( + symbol: AbstractFirBasedSymbol, + requiredPhase: FirResolvePhase + ) where D : FirDeclaration, D : FirSymbolOwner { + 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) + } +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdePhasedFirFileResolver.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdePhasedFirFileResolver.kt deleted file mode 100644 index 7b05dd9b834..00000000000 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IdePhasedFirFileResolver.kt +++ /dev/null @@ -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) - } -} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt index 099bb478581..71b1dd78eb4 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt @@ -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.FirCompositeSymbolProvider 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.session.FirSessionFactory 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.resolve.IDEPackagePartProvider 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.file.builder.FirFileBuilder 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 }) return FirIdeSourcesSession(moduleInfo, sessionProvider, searchScope, firBuilder).apply { val cache = ModuleFileCacheImpl(this) - val phasedFirFileResolver = IdePhasedFirFileResolver(FirLazyDeclarationResolver(firFileBuilder), cache) + val firPhaseManager = IdeFirPhaseManager(FirLazyDeclarationResolver(firFileBuilder), cache) registerCommonComponents() registerResolveComponents() @@ -75,7 +75,7 @@ internal object FirIdeSessionFactory { register(FirProvider::class, provider) register(FirIdeProvider::class, provider) - register(PhasedFirFileResolver::class, phasedFirFileResolver) + register(FirPhaseManager::class, firPhaseManager) register( FirSymbolProvider::class,