diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSessionProvider.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSessionProvider.kt index fe104557812..b6640157e15 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSessionProvider.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSessionProvider.kt @@ -14,7 +14,7 @@ abstract class KtAnalysisSessionProvider { } fun getAnalysisSessionFor(contextElement: KtElement): KtAnalysisSession = - service().getAnalysisSessionFor(contextElement) + contextElement.project.service().getAnalysisSessionFor(contextElement) inline fun analyze(contextElement: KtElement, action: KtAnalysisSession.() -> R): R = getAnalysisSessionFor(contextElement).action() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSessionProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSessionProvider.kt index f7ad3ea74e9..28a8e5ed50a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSessionProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSessionProvider.kt @@ -5,12 +5,29 @@ package org.jetbrains.kotlin.idea.frontend.api.fir +import com.intellij.openapi.project.Project +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager +import com.intellij.psi.util.PsiModificationTracker +import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.idea.caches.project.getModuleInfo import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider import org.jetbrains.kotlin.psi.KtElement +import java.util.concurrent.ConcurrentHashMap + +class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider() { + private val analysisSessionByModuleInfoCache = + CachedValuesManager.getManager(project).createCachedValue { + CachedValueProvider.Result( + ConcurrentHashMap(), + PsiModificationTracker.MODIFICATION_COUNT + ) + } -class KtFirAnalysisSessionProvider : KtAnalysisSessionProvider() { @Suppress("DEPRECATION") override fun getAnalysisSessionFor(contextElement: KtElement): KtAnalysisSession = - KtFirAnalysisSession(contextElement) + analysisSessionByModuleInfoCache.value.getOrPut(contextElement.getModuleInfo()) { + KtFirAnalysisSession(contextElement) + } } \ No newline at end of file diff --git a/idea/resources-fir/META-INF/plugin.xml b/idea/resources-fir/META-INF/plugin.xml index 0cd46317e94..3eb8e5c7c94 100644 --- a/idea/resources-fir/META-INF/plugin.xml +++ b/idea/resources-fir/META-INF/plugin.xml @@ -81,7 +81,7 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu -