FIR IDE: cache KtAnalysisSession for modules

This commit is contained in:
Ilya Kirillov
2020-07-06 16:30:15 +03:00
parent 8c0197e081
commit 15ecfd84b4
3 changed files with 21 additions and 4 deletions
@@ -14,7 +14,7 @@ abstract class KtAnalysisSessionProvider {
}
fun getAnalysisSessionFor(contextElement: KtElement): KtAnalysisSession =
service<KtAnalysisSessionProvider>().getAnalysisSessionFor(contextElement)
contextElement.project.service<KtAnalysisSessionProvider>().getAnalysisSessionFor(contextElement)
inline fun <R> analyze(contextElement: KtElement, action: KtAnalysisSession.() -> R): R =
getAnalysisSessionFor(contextElement).action()
@@ -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<ModuleInfo, KtAnalysisSession>(),
PsiModificationTracker.MODIFICATION_COUNT
)
}
class KtFirAnalysisSessionProvider : KtAnalysisSessionProvider() {
@Suppress("DEPRECATION")
override fun getAnalysisSessionFor(contextElement: KtElement): KtAnalysisSession =
KtFirAnalysisSession(contextElement)
analysisSessionByModuleInfoCache.value.getOrPut(contextElement.getModuleInfo()) {
KtFirAnalysisSession(contextElement)
}
}
+1 -1
View File
@@ -81,7 +81,7 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu
<extensions defaultExtensionNs="com.intellij">
<!-- fir-specific -->
<applicationService serviceInterface="org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider"
<projectService serviceInterface="org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider"
serviceImplementation="org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSessionProvider"/>
<applicationService serviceInterface="org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor"
serviceImplementation="org.jetbrains.kotlin.idea.references.KotlinFirReferenceContributor"/>