FIR IDE: reresolve libraries only when they change

This commit is contained in:
Ilya Kirillov
2020-09-03 15:02:26 +03:00
parent c48cc615dd
commit 73451b1616
2 changed files with 38 additions and 1 deletions
@@ -7,24 +7,38 @@ package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.components.service
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.LibraryModificationTracker
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.sessions.FirIdeLibrariesSession
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.util.cachedValue
import org.jetbrains.kotlin.idea.util.psiModificationTrackerBasedCachedValue
import java.util.concurrent.ConcurrentHashMap
import org.jetbrains.kotlin.idea.util.getValue
internal class FirIdeResolveStateService(private val project: Project) {
private val stateCache by psiModificationTrackerBasedCachedValue(project) {
ConcurrentHashMap<IdeaModuleInfo, FirModuleResolveStateImpl>()
}
private val librarySessionCache by cachedValue(project, LibraryModificationTracker.getInstance(project)) {
ConcurrentHashMap<IdeaModuleInfo, FirIdeLibrariesSession>()
}
private fun createResolveStateFor(moduleInfo: IdeaModuleInfo): FirModuleResolveStateImpl {
require(moduleInfo is ModuleSourceInfo)
val firPhaseRunner = FirPhaseRunner()
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(
project,
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
)
}