[LL FIR] resolve file to import phase only under lock

^KT-56551
This commit is contained in:
Dmitrii Gridin
2023-05-18 15:19:55 +02:00
committed by Space Team
parent 8e3469f220
commit 81ff3916e6
@@ -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.getContainingFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
import org.jetbrains.kotlin.analysis.utils.errors.rethrowExceptionWithDetails 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.FirElementWithResolveState
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.visitors.transformSingle
internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirModuleResolveComponents) { internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirModuleResolveComponents) {
/** /**
@@ -120,7 +120,8 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
onAirCreatedDeclaration: Boolean, onAirCreatedDeclaration: Boolean,
towerDataContextCollector: FirTowerDataContextCollector?, towerDataContextCollector: FirTowerDataContextCollector?,
) { ) {
resolveFileToImportsWithoutLock(designation.firFile) resolveFileToImportsWithLock(designation.firFile)
val target = when (designation.target) { val target = when (designation.target) {
is FirRegularClass -> LLFirClassWithAllMembersResolveTarget(designation.firFile, designation.path, designation.target) is FirRegularClass -> LLFirClassWithAllMembersResolveTarget(designation.firFile, designation.path, designation.target)
else -> LLFirSingleResolveTarget(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) { private fun resolveContainingFileToImports(target: FirElementWithResolveState) {
if (target.resolvePhase >= FirResolvePhase.IMPORTS) return if (target.resolvePhase >= FirResolvePhase.IMPORTS) return
val firFile = target.getContainingFile() ?: return val firFile = target.getContainingFile() ?: return
if (firFile.resolvePhase >= FirResolvePhase.IMPORTS) return resolveFileToImportsWithLock(firFile)
moduleComponents.globalResolveComponents.lockProvider.withWriteLock(firFile, FirResolvePhase.IMPORTS) {
resolveFileToImportsWithoutLock(firFile)
}
} }
private fun resolveFileToImportsWithoutLock(firFile: FirFile) { private fun resolveFileToImportsWithLock(firFile: FirFile) {
if (firFile.resolvePhase >= FirResolvePhase.IMPORTS) return moduleComponents.globalResolveComponents.lockProvider.withWriteLock(firFile, FirResolvePhase.IMPORTS) {
checkCanceled() firFile.transformSingle(FirImportResolveTransformer(firFile.moduleData.session), null)
firFile.transform<FirElement, Any?>(FirImportResolveTransformer(firFile.moduleData.session), null) }
} }
private fun lazyResolveTargets( private fun lazyResolveTargets(