From 60ea64143c08d268f92bc63974e11c41e23e42c1 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 6 Apr 2021 15:52:07 +0200 Subject: [PATCH] FIR IDE: reuse scope session between different resolve calls for the same file --- .../level/api/element/builder/FirElementBuilder.kt | 2 ++ .../low/level/api/file/builder/FirFileBuilder.kt | 13 ++++++++++--- .../low/level/api/file/structure/FileStructure.kt | 5 ++++- .../api/lazy/resolve/FirLazyDeclarationResolver.kt | 8 +++++--- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt index cdc1ae24ac0..6cdade1e029 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt @@ -10,6 +10,7 @@ import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.fir.FirElement 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.idea.fir.low.level.api.annotations.ThreadSafe import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache @@ -60,6 +61,7 @@ internal class FirElementBuilder { ktFile, moduleFileCache, FirResolvePhase.BODY_RESOLVE, + scopeSession = ScopeSession(), checkPCE = true ) 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 c928290114b..30ac4d2f327 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 @@ -50,6 +50,7 @@ internal class FirFileBuilder( ktFile: KtFile, cache: ModuleFileCache, @Suppress("SameParameterValue") toPhase: FirResolvePhase, + scopeSession: ScopeSession, checkPCE: Boolean ): FirFile { val needResolve = toPhase > FirResolvePhase.RAW_FIR @@ -57,7 +58,13 @@ internal class FirFileBuilder( if (needResolve) { cache.firFileLockProvider.withWriteLock(firFile) { if (firFile.resolvePhase >= toPhase) return@withWriteLock - runResolveWithoutLock(firFile, fromPhase = firFile.resolvePhase, toPhase = toPhase, checkPCE = checkPCE) + runResolveWithoutLock( + firFile, + fromPhase = firFile.resolvePhase, + toPhase = toPhase, + scopeSession = scopeSession, + checkPCE = checkPCE, + ) } } return firFile @@ -76,13 +83,13 @@ internal class FirFileBuilder( firFile: FirFile, fromPhase: FirResolvePhase, toPhase: FirResolvePhase, - checkPCE: Boolean + scopeSession: ScopeSession, + checkPCE: Boolean, ) { assert(fromPhase <= toPhase) { "Trying to resolve file ${firFile.name} from $fromPhase to $toPhase" } var currentPhase = fromPhase - val scopeSession = ScopeSession() while (currentPhase < toPhase) { if (checkPCE) checkCanceled() currentPhase = currentPhase.next diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt index c03fc05054f..3dccef87c8f 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt @@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic 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.idea.fir.low.level.api.api.DiagnosticCheckerFilter import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalContainingOrThisDeclaration @@ -120,13 +121,15 @@ internal class FileStructure( private fun createStructureElement(container: KtAnnotated): FileStructureElement = when (container) { is KtFile -> { + val scopeSession = ScopeSession() val firFile = firFileBuilder.getFirFileResolvedToPhaseWithCaching( container, moduleFileCache, FirResolvePhase.IMPORTS, + scopeSession, checkPCE = true ) - firLazyDeclarationResolver.resolveFileAnnotations(firFile, moduleFileCache) + firLazyDeclarationResolver.resolveFileAnnotations(firFile, moduleFileCache, scopeSession) RootStructureElement( firFile, container, 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 c631bb6bdf9..42ac3b4caf6 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 @@ -31,7 +31,7 @@ internal class FirLazyDeclarationResolver( fun resolveFileAnnotations( firFile: FirFile, moduleFileCache: ModuleFileCache, - scopeSession: ScopeSession = ScopeSession() + scopeSession: ScopeSession, ) { firFileBuilder.runCustomResolveUnderLock(firFile, moduleFileCache) { val transformer = FirFileAnnotationsResolveTransformer(firFile.session, scopeSession) @@ -118,16 +118,19 @@ internal class FirLazyDeclarationResolver( ) { if (fromPhase >= toPhase) return val nonLazyPhase = minOf(toPhase, LAST_NON_LAZY_PHASE) + + val scopeSession = ScopeSession() if (fromPhase < nonLazyPhase) { firFileBuilder.runResolveWithoutLock( containerFirFile, fromPhase = fromPhase, toPhase = nonLazyPhase, + scopeSession = scopeSession, checkPCE = checkPCE ) } if (toPhase <= nonLazyPhase) return - resolveFileAnnotations(containerFirFile, moduleFileCache) + resolveFileAnnotations(containerFirFile, moduleFileCache, scopeSession) val nonLocalDeclarationToResolve = firDeclarationToResolve.getNonLocalDeclarationToResolve(provider, moduleFileCache) val designation = nonLocalDeclarationToResolve.getDesignation(containerFirFile, provider, moduleFileCache) @@ -137,7 +140,6 @@ internal class FirLazyDeclarationResolver( } var currentPhase = nonLazyPhase - val scopeSession = ScopeSession() while (currentPhase < toPhase) { currentPhase = currentPhase.next