From 2cfbfabe049278d6fecd68b771627e04521bb06e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 12 Sep 2020 11:14:10 +0300 Subject: [PATCH] FIR IDE: do not recreate transformer phases & ScopeSession --- .../idea/fir/low/level/api/FirPhaseRunner.kt | 14 ++++++-------- .../low/level/api/file/builder/FirFileBuilder.kt | 3 +-- .../api/lazy/resolve/FirLazyDeclarationResolver.kt | 3 ++- .../low/level/api/sessions/FirIdeSessionFactory.kt | 7 +++++++ .../api/fir/components/KtFirScopeProvider.kt | 7 ++++--- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirPhaseRunner.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirPhaseRunner.kt index 99df38d2076..3e66215ba0c 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirPhaseRunner.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirPhaseRunner.kt @@ -7,8 +7,6 @@ package org.jetbrains.kotlin.idea.fir.low.level.api import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.transformers.createTransformerBasedProcessorByPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE import java.util.concurrent.locks.ReentrantLock import kotlin.concurrent.withLock @@ -17,20 +15,20 @@ internal class FirPhaseRunner { private val superTypesBodyResolveLock = ReentrantLock() private val implicitTypesResolveLock = ReentrantLock() - fun runPhase(firFile: FirFile, phase: FirResolvePhase, scopeSession: ScopeSession) = when (phase) { + fun runPhase(firFile: FirFile, phase: FirResolvePhase) = when (phase) { FirResolvePhase.SUPER_TYPES -> superTypesBodyResolveLock.withLock { - runPhaseWithoutLock(firFile, phase, scopeSession) + runPhaseWithoutLock(firFile, phase) } FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE -> implicitTypesResolveLock.withLock { - runPhaseWithoutLock(firFile, phase, scopeSession) + runPhaseWithoutLock(firFile, phase) } else -> { - runPhaseWithoutLock(firFile, phase, scopeSession) + runPhaseWithoutLock(firFile, phase) } } - private fun runPhaseWithoutLock(firFile: FirFile, phase: FirResolvePhase, scopeSession: ScopeSession) { - val phaseProcessor = phase.createTransformerBasedProcessorByPhase(firFile.session, scopeSession) + private fun runPhaseWithoutLock(firFile: FirFile, phase: FirResolvePhase) { + val phaseProcessor = firFile.session.firTransformerProvider.getTransformerForPhase(phase) executeWithoutPCE { phaseProcessor.processFile(firFile) } } } \ 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/file/builder/FirFileBuilder.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/builder/FirFileBuilder.kt index b7ed1290047..7d871b36f80 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/builder/FirFileBuilder.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/builder/FirFileBuilder.kt @@ -72,12 +72,11 @@ internal class FirFileBuilder( assert(fromPhase <= toPhase) { "Trying to resolve file ${firFile.name} from $fromPhase to $toPhase" } - val scopeSession = ScopeSession() var currentPhase = fromPhase while (currentPhase < toPhase) { if (checkPCE) checkCanceled() currentPhase = currentPhase.next - firPhaseRunner.runPhase(firFile, currentPhase, scopeSession) + firPhaseRunner.runPhase(firFile, currentPhase) } } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt index 743992ec4e1..0c5530c0079 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirDesignated import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalContainingOrThisDeclaration import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache +import org.jetbrains.kotlin.idea.fir.low.level.api.firTransformerProvider import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider import org.jetbrains.kotlin.idea.fir.low.level.api.util.checkCanceled import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE @@ -127,7 +128,7 @@ internal class FirLazyDeclarationResolver( if (designation.all { it.resolvePhase >= toPhase }) { return } - val scopeSession = ScopeSession() + val scopeSession = containerFirFile.session.firTransformerProvider.getScopeSession() val transformer = FirDesignatedBodyResolveTransformerForIDE( designation.iterator(), containerFirFile.session, scopeSession, 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 dea6013c400..6036fecb33a 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 @@ -110,6 +110,7 @@ internal object FirIdeSessionFactory { registerCommonComponents() registerResolveComponents() + registerIdeComponents() val provider = FirIdeProvider( project, @@ -165,6 +166,7 @@ internal object FirIdeSessionFactory { return FirIdeLibrariesSession(moduleInfo, sessionProvider, searchScope).apply { registerCommonComponents() registerJavaSpecificComponents() + registerIdeComponents() val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, searchScope) @@ -192,4 +194,9 @@ internal object FirIdeSessionFactory { ) } } + + private fun FirIdeSession.registerIdeComponents() { + register(IdeSessionComponents::class, IdeSessionComponents.create(this)) + register(FirTransformerProvider::class, FirTransformerProvider(this)) + } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt index bd55cada631..d244b6250d9 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade +import org.jetbrains.kotlin.idea.fir.low.level.api.firTransformerProvider import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner @@ -59,7 +60,7 @@ internal class KtFirScopeProvider( check(classSymbol is KtFirClassOrObjectSymbol) val firScope = classSymbol.firRef.withFir(FirResolvePhase.SUPER_TYPES) { fir -> - fir.unsubstitutedScope(fir.session, ScopeSession()) + fir.unsubstitutedScope(fir.session, fir.session.firTransformerProvider.getScopeSession()) }.also(firScopeStorage::register) KtFirMemberScope(classSymbol, firScope, token, builder) } @@ -91,8 +92,8 @@ internal class KtFirScopeProvider( override fun getTypeScope(type: KtType): KtScope? { check(type is KtFirType) { "KtFirScopeProvider can only work with KtFirType, but ${type::class} was provided" } - - val firTypeScope = type.coneType.scope(firResolveState.currentModuleSourcesSession, ScopeSession()) ?: return null + val firSession = firResolveState.currentModuleSourcesSession + val firTypeScope = type.coneType.scope(firSession, firSession.firTransformerProvider.getScopeSession()) ?: return null return convertToKtScope(firTypeScope) }