FIR IDE: cache KtAnalysisSession for modules
This commit is contained in:
+1
-1
@@ -14,7 +14,7 @@ abstract class KtAnalysisSessionProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getAnalysisSessionFor(contextElement: KtElement): KtAnalysisSession =
|
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 =
|
inline fun <R> analyze(contextElement: KtElement, action: KtAnalysisSession.() -> R): R =
|
||||||
getAnalysisSessionFor(contextElement).action()
|
getAnalysisSessionFor(contextElement).action()
|
||||||
|
|||||||
+19
-2
@@ -5,12 +5,29 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.frontend.api.fir
|
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.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
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")
|
@Suppress("DEPRECATION")
|
||||||
override fun getAnalysisSessionFor(contextElement: KtElement): KtAnalysisSession =
|
override fun getAnalysisSessionFor(contextElement: KtElement): KtAnalysisSession =
|
||||||
KtFirAnalysisSession(contextElement)
|
analysisSessionByModuleInfoCache.value.getOrPut(contextElement.getModuleInfo()) {
|
||||||
|
KtFirAnalysisSession(contextElement)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -81,7 +81,7 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu
|
|||||||
|
|
||||||
<extensions defaultExtensionNs="com.intellij">
|
<extensions defaultExtensionNs="com.intellij">
|
||||||
<!-- fir-specific -->
|
<!-- 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"/>
|
serviceImplementation="org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSessionProvider"/>
|
||||||
<applicationService serviceInterface="org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor"
|
<applicationService serviceInterface="org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor"
|
||||||
serviceImplementation="org.jetbrains.kotlin.idea.references.KotlinFirReferenceContributor"/>
|
serviceImplementation="org.jetbrains.kotlin.idea.references.KotlinFirReferenceContributor"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user