diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirLockProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirLockProvider.kt index c40fbb30146..381fa8d4b1e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirLockProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirLockProvider.kt @@ -1,10 +1,11 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 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.analysis.low.level.api.fir.file.builder +import com.intellij.util.containers.ContainerUtil import com.intellij.openapi.progress.ProcessCanceledException import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession import org.jetbrains.kotlin.analysis.low.level.api.fir.util.lockWithPCECheck @@ -19,6 +20,8 @@ internal class LLFirLockProvider { //We temporarily disable multi-locks to fix deadlocks problem private val globalLock = ReentrantLock() + private val locksForImports = ContainerUtil.createConcurrentSoftMap() + inline fun withLock( key: FirFile, lockingIntervalMs: Long = DEFAULT_LOCKING_INTERVAL, @@ -32,6 +35,13 @@ internal class LLFirLockProvider { action() } } + + inline fun withLocksForImportResolution( + file: FirFile, + action: () -> R + ): R { + return locksForImports.getOrPut(file) { ReentrantLock() }.lockWithPCECheck(DEFAULT_LOCKING_INTERVAL) { action() } + } } private const val DEFAULT_LOCKING_INTERVAL = 50L \ No newline at end of file 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 307d26da095..1c1bcb213dc 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 @@ -68,7 +68,7 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod if (target.resolvePhase >= FirResolvePhase.IMPORTS) return val firFile = target.getContainingFile() ?: return if (firFile.resolvePhase >= FirResolvePhase.IMPORTS) return - moduleComponents.globalResolveComponents.lockProvider.withLock(firFile) { + moduleComponents.globalResolveComponents.lockProvider.withLocksForImportResolution(firFile) { resolveFileToImportsWithoutLock(firFile) } }