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 96133b2c12c..2763b1b2f0b 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 @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LLFirFirProviderInterceptor import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LLFirLazyTransformerExecutor 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 @@ -25,7 +26,6 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector import org.jetbrains.kotlin.psi.KtClassBody @@ -69,7 +69,9 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod else -> throwUnexpectedFirElementError(this) } - private fun resolveFileToImports(firFile: FirFile) { + private fun resolveContainingFileToImports(target: FirElementWithResolvePhase) { + if (target.resolvePhase >= FirResolvePhase.IMPORTS) return + val firFile = target.getContainingFile() ?: return if (firFile.resolvePhase >= FirResolvePhase.IMPORTS) return moduleComponents.globalResolveComponents.lockProvider.runCustomResolveUnderLock(firFile) { resolveFileToImportsWithoutLock(firFile) @@ -83,19 +85,6 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod firFile.replaceResolvePhase(FirResolvePhase.IMPORTS) } - - private fun fastTrackForImportsPhase(target: FirElementWithResolvePhase): Boolean { - val provider = target.moduleData.session.firProvider - val firFile = when (target) { - is FirFile -> target - is FirCallableDeclaration -> provider.getFirCallableContainerFile(target.symbol) - is FirClassLikeDeclaration -> provider.getFirClassifierContainerFile(target.symbol) - else -> null - } ?: return false - resolveFileToImports(firFile) - return true - } - /** * Run designated resolve only designation with fully resolved path (synchronized). * Suitable for body resolve or/and on-air resolve. @@ -121,11 +110,8 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod toPhase: FirResolvePhase, ) { if (target.resolvePhase >= toPhase) return - if (toPhase == FirResolvePhase.IMPORTS) { - if (fastTrackForImportsPhase(target)) { - return - } - } + resolveContainingFileToImports(target) + if (toPhase == FirResolvePhase.IMPORTS) return for (designation in declarationDesignationsToResolve(target)) { if (!designation.target.isValidForResolve()) continue @@ -166,10 +152,6 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod scopeSession: ScopeSession, toPhase: FirResolvePhase, ) { - if (toPhase == FirResolvePhase.RAW_FIR) return - resolveFileToImportsWithoutLock(designation.firFile) - if (toPhase == FirResolvePhase.IMPORTS) return - val declarationResolvePhase = designation.target.resolvePhase if (declarationResolvePhase >= toPhase) return diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt index 022f9141685..c9ad2c578d0 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt @@ -22,7 +22,7 @@ fun FirElementWithResolvePhase.getContainingFile(): FirFile? { is FirPropertyAccessor -> propertySymbol.fir.getContainingFile() is FirValueParameter -> containingFunctionSymbol.fir.getContainingFile() is FirCallableDeclaration -> provider.getFirCallableContainerFile(symbol) - is FirClassLikeDeclaration -> provider.getFirClassifierContainerFile(symbol) + is FirClassLikeDeclaration -> provider.getFirClassifierContainerFileIfAny(symbol) is FirDanglingModifierList -> { val ktFile = psi?.containingFile as? KtFile ?: error("File for dangling modifier list cannot be null")