From 81ff3916e6eb6e47b255d3ee2a9d71444b3ded45 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 18 May 2023 15:19:55 +0200 Subject: [PATCH] [LL FIR] resolve file to import phase only under lock ^KT-56551 --- .../LLFirModuleLazyDeclarationResolver.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt index dca8e10fdf0..60f34135f13 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt @@ -19,12 +19,12 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry import org.jetbrains.kotlin.analysis.utils.errors.rethrowExceptionWithDetails -import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElementWithResolveState import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector +import org.jetbrains.kotlin.fir.visitors.transformSingle internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirModuleResolveComponents) { /** @@ -120,7 +120,8 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod onAirCreatedDeclaration: Boolean, towerDataContextCollector: FirTowerDataContextCollector?, ) { - resolveFileToImportsWithoutLock(designation.firFile) + resolveFileToImportsWithLock(designation.firFile) + val target = when (designation.target) { is FirRegularClass -> LLFirClassWithAllMembersResolveTarget(designation.firFile, designation.path, designation.target) else -> LLFirSingleResolveTarget(designation.firFile, designation.path, designation.target) @@ -145,16 +146,13 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod private fun resolveContainingFileToImports(target: FirElementWithResolveState) { if (target.resolvePhase >= FirResolvePhase.IMPORTS) return val firFile = target.getContainingFile() ?: return - if (firFile.resolvePhase >= FirResolvePhase.IMPORTS) return - moduleComponents.globalResolveComponents.lockProvider.withWriteLock(firFile, FirResolvePhase.IMPORTS) { - resolveFileToImportsWithoutLock(firFile) - } + resolveFileToImportsWithLock(firFile) } - private fun resolveFileToImportsWithoutLock(firFile: FirFile) { - if (firFile.resolvePhase >= FirResolvePhase.IMPORTS) return - checkCanceled() - firFile.transform(FirImportResolveTransformer(firFile.moduleData.session), null) + private fun resolveFileToImportsWithLock(firFile: FirFile) { + moduleComponents.globalResolveComponents.lockProvider.withWriteLock(firFile, FirResolvePhase.IMPORTS) { + firFile.transformSingle(FirImportResolveTransformer(firFile.moduleData.session), null) + } } private fun lazyResolveTargets(