diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveState.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveState.kt index b5cc47edbd3..a5b33dbff65 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveState.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveState.kt @@ -21,39 +21,34 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile abstract class FirModuleResolveState { - abstract val moduleInfo: IdeaModuleInfo abstract val rootModuleSession: FirSession + internal abstract val moduleInfo: IdeaModuleInfo + abstract val firTransformerProvider: FirTransformerProvider - abstract fun getSessionFor(moduleInfo: IdeaModuleInfo): FirSession + internal abstract fun getSessionFor(moduleInfo: IdeaModuleInfo): FirSession - abstract fun getOrBuildFirFor(element: KtElement): FirElement + internal abstract fun getOrBuildFirFor(element: KtElement): FirElement - abstract fun getFirFile(ktFile: KtFile): FirFile + internal abstract fun getFirFile(ktFile: KtFile): FirFile - abstract fun getDiagnostics(element: KtElement): List + internal abstract fun getDiagnostics(element: KtElement): List - abstract fun collectDiagnosticsForFile(ktFile: KtFile): Collection + internal abstract fun collectDiagnosticsForFile(ktFile: KtFile): Collection // todo temporary, used only in completion - abstract fun recordPsiToFirMappingsForCompletionFrom(fir: FirDeclaration, firFile: FirFile, ktFile: KtFile) + internal abstract fun recordPsiToFirMappingsForCompletionFrom(fir: FirDeclaration, firFile: FirFile, ktFile: KtFile) - abstract fun resolvedFirToPhase(declaration: D, toPhase: FirResolvePhase): D + internal abstract fun resolvedFirToPhase(declaration: D, toPhase: FirResolvePhase): D // todo temporary, used only in completion - abstract fun lazyResolveDeclarationForCompletion( + internal abstract fun lazyResolveDeclarationForCompletion( firFunction: FirDeclaration, containerFirFile: FirFile, firIdeProvider: FirProvider, toPhase: FirResolvePhase, towerDataContextCollector: FirTowerDataContextCollector ) - } - -internal fun KtElement.firResolveState(): FirModuleResolveState = - FirIdeResolveStateService.getInstance(project).getResolveState(getModuleInfo()) - - diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt index e76e6ec735e..9631a45f5bb 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt @@ -8,12 +8,20 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.api import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.project.getModuleInfo +import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeResolveStateService import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtFile object LowLevelFirApiFacade { fun getResolveStateFor(element: KtElement): FirModuleResolveState = - element.firResolveState() + getResolveStateFor(element.getModuleInfo()) + + fun getResolveStateFor(moduleInfo: IdeaModuleInfo): FirModuleResolveState = + FirIdeResolveStateService.getInstance(moduleInfo.project!!).getResolveState(moduleInfo) fun getSessionFor(element: KtElement): FirSession = getResolveStateFor(element).getSessionFor(element.getModuleInfo()) @@ -21,7 +29,20 @@ object LowLevelFirApiFacade { fun getOrBuildFirFor(element: KtElement, resolveState: FirModuleResolveState): FirElement = resolveState.getOrBuildFirFor(element) - fun getDiagnosticsFor(element: KtElement, resolveState: FirModuleResolveState): Collection { - return resolveState.getDiagnostics(element) - } + fun getFirFile(ktFile: KtFile, resolveState: FirModuleResolveState) = + resolveState.getFirFile(ktFile) + + fun getDiagnosticsFor(element: KtElement, resolveState: FirModuleResolveState): Collection = + resolveState.getDiagnostics(element) + + fun collectDiagnosticsForFile(ktFile: KtFile, resolveState: FirModuleResolveState): Collection = + resolveState.collectDiagnosticsForFile(ktFile) + + fun resolvedFirToPhase( + firDeclaration: D, + phase: FirResolvePhase, + resolveState: FirModuleResolveState + ): D = + resolveState.resolvedFirToPhase(firDeclaration, phase) + } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCompletionCandidateChecker.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCompletionCandidateChecker.kt index e65a6b492b3..ba423ff3f64 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCompletionCandidateChecker.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCompletionCandidateChecker.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade +import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForCompletion import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.ResolutionParameters import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.SingleCandidateResolutionMode import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.SingleCandidateResolver @@ -67,7 +68,7 @@ internal class KtFirCompletionCandidateChecker( nameExpression: KtSimpleNameExpression, possibleExplicitReceiver: KtExpression?, ): Boolean { - val file = firResolveState.getFirFile(originalFile) + val file = LowLevelFirApiFacade.getFirFile(originalFile, firResolveState) val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType(firResolveState) val resolver = SingleCandidateResolver(firResolveState.rootModuleSession, file) val implicitReceivers = getImplicitReceivers(originalFile, file, nameExpression) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirDiagnosticProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirDiagnosticProvider.kt index e662d132bf7..49d7412dffb 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirDiagnosticProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirDiagnosticProvider.kt @@ -23,5 +23,5 @@ internal class KtFirDiagnosticProvider( } override fun collectDiagnosticsForFile(ktFile: KtFile): Collection = - firResolveState.collectDiagnosticsForFile(ktFile) + LowLevelFirApiFacade.getDiagnosticsFor(ktFile, firResolveState) } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt index 50c24078154..c4ef67772a9 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt @@ -128,7 +128,7 @@ internal class KtFirScopeProvider( originalFile: KtFile, positionInFakeFile: KtElement ): LowLevelFirApiFacadeForCompletion.FirCompletionContext { - val originalFirFile = firResolveState.getFirFile(originalFile) + val originalFirFile = LowLevelFirApiFacade.getFirFile(originalFile, firResolveState) val declarationContext = EnclosingDeclarationContext.detect(originalFile, positionInFakeFile) return declarationContext.buildCompletionContext(originalFirFile, firResolveState) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRef.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRef.kt index f296aa77175..5241913fd1a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRef.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRef.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.utils import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState +import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.assertIsValid @@ -22,7 +23,7 @@ internal class FirRef(fir: D, resolveState: FirModuleResolve val fir = firWeakRef.get() ?: error("FirElement was garbage collected while analysis session is still valid") val resolveState = resolveStateWeakRef.get() ?: error("FirModuleResolveState was garbage collected while analysis session is still valid") - return action(resolveState.resolvedFirToPhase(fir, phase)) + return action(LowLevelFirApiFacade.resolvedFirToPhase(fir, phase, resolveState)) } inline fun withFirAndCache(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, crossinline createValue: (fir: D) -> R) =