From bf977d4262500e9c260f6da8bd1221bc84df8a36 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 16 Mar 2023 01:35:21 +0900 Subject: [PATCH] [LL API] Don't invalidate 'LLFirResolvableResolveSession' on OOBs --- .../level/api/fir/LLFirResolveStateService.kt | 10 ++++----- ...OrLibrarySourceResolvableResolveSession.kt | 5 +++-- .../LLFirNotUnderContentRootResolveSession.kt | 5 +++-- .../state/LLFirResolvableResolveSession.kt | 22 ++++++++++--------- .../fir/state/LLFirScriptResolveSession.kt | 7 +++--- .../fir/state/LLFirSourceResolveSession.kt | 5 +++-- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveStateService.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveStateService.kt index 057aa894122..aacbebe4965 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveStateService.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveStateService.kt @@ -30,13 +30,11 @@ class LLFirResolveSessionService(project: Project) { } private fun create(module: KtModule, factory: (KtModule) -> LLFirSession): LLFirResolvableResolveSession { - val session = factory(module) - return when (module) { - is KtSourceModule -> LLFirSourceResolveSession(session) - is KtLibraryModule, is KtLibrarySourceModule -> LLFirLibraryOrLibrarySourceResolvableResolveSession(session) - is KtScriptModule -> LLFirScriptResolveSession(session) - is KtNotUnderContentRootModule -> LLFirNotUnderContentRootResolveSession(session) + is KtSourceModule -> LLFirSourceResolveSession(module, factory) + is KtLibraryModule, is KtLibrarySourceModule -> LLFirLibraryOrLibrarySourceResolvableResolveSession(module, factory) + is KtScriptModule -> LLFirScriptResolveSession(module, factory) + is KtNotUnderContentRootModule -> LLFirNotUnderContentRootResolveSession(module, factory) else -> { errorWithFirSpecificEntries("Unexpected ${module::class.java}") { withEntry("module", module) { it.moduleDescription } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirLibraryOrLibrarySourceResolvableResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirLibraryOrLibrarySourceResolvableResolveSession.kt index 58ef51cbd48..10c2de9a705 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirLibraryOrLibrarySourceResolvableResolveSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirLibraryOrLibrarySourceResolvableResolveSession.kt @@ -14,8 +14,9 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile internal class LLFirLibraryOrLibrarySourceResolvableResolveSession( - useSiteFirSession: LLFirSession -) : LLFirResolvableResolveSession(useSiteFirSession) { + useSiteKtModule: KtModule, + useSiteSessionFactory: (KtModule) -> LLFirSession +) : LLFirResolvableResolveSession(useSiteKtModule, useSiteSessionFactory) { override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List = emptyList() diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirNotUnderContentRootResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirNotUnderContentRootResolveSession.kt index cd329c54d59..56a470ec9b6 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirNotUnderContentRootResolveSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirNotUnderContentRootResolveSession.kt @@ -13,8 +13,9 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile internal class LLFirNotUnderContentRootResolveSession( - useSiteFirSession: LLFirSession -) : LLFirResolvableResolveSession(useSiteFirSession) { + useSiteKtModule: KtModule, + useSiteSessionFactory: (KtModule) -> LLFirSession +) : LLFirResolvableResolveSession(useSiteKtModule, useSiteSessionFactory) { override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List = emptyList() diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt index 1161fc5e0e8..a110d40d7ba 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt @@ -5,8 +5,9 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.state -import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider @@ -41,21 +42,22 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile -@Suppress("PrivatePropertyName") -private val LOG = Logger.getInstance(LLFirResolvableResolveSession::class.java) - internal abstract class LLFirResolvableResolveSession( - final override val useSiteFirSession: LLFirSession + final override val useSiteKtModule: KtModule, + private val useSiteSessionFactory: (KtModule) -> LLFirSession ) : LLFirResolveSession() { - final override val useSiteKtModule: KtModule - get() = useSiteFirSession.ktModule - final override val project: Project get() = useSiteKtModule.project - override fun getSessionFor(module: KtModule): LLFirSession { - LOG.assertTrue(useSiteFirSession.isValid, "Use-site session is invalid") + private val useSiteFirSessionCached = CachedValuesManager.getManager(project).createCachedValue { + val session = useSiteSessionFactory(useSiteKtModule) + CachedValueProvider.Result.create(session, session.modificationTracker) + } + final override val useSiteFirSession: LLFirSession + get() = useSiteFirSessionCached.value + + override fun getSessionFor(module: KtModule): LLFirSession { if (module == useSiteFirSession.ktModule) { return useSiteFirSession } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirScriptResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirScriptResolveSession.kt index 4d77f7ea962..eeb877effe5 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirScriptResolveSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirScriptResolveSession.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.state import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter -import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.* +import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession import org.jetbrains.kotlin.analysis.project.structure.* import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic @@ -14,8 +14,9 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile internal class LLFirScriptResolveSession( - useSiteFirSession: LLFirSession -) : LLFirResolvableResolveSession(useSiteFirSession) { + useSiteKtModule: KtModule, + useSiteSessionFactory: (KtModule) -> LLFirSession +) : LLFirResolvableResolveSession(useSiteKtModule, useSiteSessionFactory) { override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List { val moduleComponents = getModuleComponentsForElement(element) return moduleComponents.diagnosticsCollector.getDiagnosticsFor(element, filter) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirSourceResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirSourceResolveSession.kt index 3beb09b99dd..828de5f3987 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirSourceResolveSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirSourceResolveSession.kt @@ -17,8 +17,9 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile internal class LLFirSourceResolveSession( - useSiteFirSession: LLFirSession -) : LLFirResolvableResolveSession(useSiteFirSession) { + useSiteKtModule: KtModule, + useSiteSessionFactory: (KtModule) -> LLFirSession +) : LLFirResolvableResolveSession(useSiteKtModule, useSiteSessionFactory) { override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List { val moduleComponents = getModuleComponentsForElement(element) return moduleComponents.diagnosticsCollector.getDiagnosticsFor(element, filter)