FIR IDE: reresolve libraries only when they change
This commit is contained in:
+15
-1
@@ -7,24 +7,38 @@ package org.jetbrains.kotlin.idea.fir.low.level.api
|
|||||||
|
|
||||||
import com.intellij.openapi.components.service
|
import com.intellij.openapi.components.service
|
||||||
import com.intellij.openapi.project.Project
|
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.idea.caches.project.IdeaModuleInfo
|
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
|
||||||
|
import org.jetbrains.kotlin.idea.caches.project.LibraryModificationTracker
|
||||||
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver
|
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeLibrariesSession
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionFactory
|
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionFactory
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionProvider
|
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionProvider
|
||||||
|
import org.jetbrains.kotlin.idea.util.cachedValue
|
||||||
import org.jetbrains.kotlin.idea.util.psiModificationTrackerBasedCachedValue
|
import org.jetbrains.kotlin.idea.util.psiModificationTrackerBasedCachedValue
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
import org.jetbrains.kotlin.idea.util.getValue
|
||||||
|
|
||||||
internal class FirIdeResolveStateService(private val project: Project) {
|
internal class FirIdeResolveStateService(private val project: Project) {
|
||||||
private val stateCache by psiModificationTrackerBasedCachedValue(project) {
|
private val stateCache by psiModificationTrackerBasedCachedValue(project) {
|
||||||
ConcurrentHashMap<IdeaModuleInfo, FirModuleResolveStateImpl>()
|
ConcurrentHashMap<IdeaModuleInfo, FirModuleResolveStateImpl>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val librarySessionCache by cachedValue(project, LibraryModificationTracker.getInstance(project)) {
|
||||||
|
ConcurrentHashMap<IdeaModuleInfo, FirIdeLibrariesSession>()
|
||||||
|
}
|
||||||
|
|
||||||
private fun createResolveStateFor(moduleInfo: IdeaModuleInfo): FirModuleResolveStateImpl {
|
private fun createResolveStateFor(moduleInfo: IdeaModuleInfo): FirModuleResolveStateImpl {
|
||||||
|
require(moduleInfo is ModuleSourceInfo)
|
||||||
val firPhaseRunner = FirPhaseRunner()
|
val firPhaseRunner = FirPhaseRunner()
|
||||||
val sessionProvider = FirIdeSessionProvider(project)
|
val sessionProvider = FirIdeSessionProvider(project)
|
||||||
|
|
||||||
val librariesSession = FirIdeSessionFactory.createLibrarySession(moduleInfo as ModuleSourceInfo, sessionProvider, project)
|
val librariesSession = librarySessionCache.computeIfAbsent(moduleInfo) {
|
||||||
|
FirIdeSessionFactory.createLibrarySession(moduleInfo, sessionProvider, project)
|
||||||
|
}
|
||||||
val sourcesSession = FirIdeSessionFactory.createSourcesSession(
|
val sourcesSession = FirIdeSessionFactory.createSourcesSession(
|
||||||
project,
|
project,
|
||||||
moduleInfo,
|
moduleInfo,
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.util
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.psi.util.CachedValue
|
||||||
|
import com.intellij.psi.util.CachedValueProvider
|
||||||
|
import com.intellij.psi.util.CachedValuesManager
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline operator fun <T> CachedValue<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
|
||||||
|
|
||||||
|
inline fun <T> cachedValue(project: Project, vararg dependencies: Any, crossinline createValue: () -> T) =
|
||||||
|
CachedValuesManager.getManager(project).createCachedValue {
|
||||||
|
CachedValueProvider.Result(
|
||||||
|
createValue(),
|
||||||
|
dependencies
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user