From c33bedb4171f5d2e0f22274ed86beb570ccba51c Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 20 Feb 2023 18:12:50 +0900 Subject: [PATCH] [LL API] Simplify 'KtFirAnalysisSessionProvider' The 'CachingKtAnalysisSessionProvider' was only used in 'KtFirAnalysisSessionProvider', and reasons why it was created (reusing code between FE10 and K2 session provider implementations) is not actual anymore. --- .../api/fir/KtFirAnalysisSessionProvider.kt | 63 ++++++++++++--- .../base/CachingKtAnalysisSessionProvider.kt | 79 ------------------- 2 files changed, 50 insertions(+), 92 deletions(-) delete mode 100644 analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt index 8b32a366330..59683dfd378 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt @@ -6,29 +6,66 @@ package org.jetbrains.kotlin.analysis.api.fir import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ProjectRootModificationTracker +import com.intellij.openapi.util.LowMemoryWatcher +import com.intellij.psi.util.PsiModificationTracker +import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol -import org.jetbrains.kotlin.analysis.api.fir.utils.withSymbolAttachment -import org.jetbrains.kotlin.analysis.api.impl.base.CachingKtAnalysisSessionProvider -import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenFactory +import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession import org.jetbrains.kotlin.analysis.project.structure.KtModule +import org.jetbrains.kotlin.analysis.project.structure.getKtModule +import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker +import org.jetbrains.kotlin.analysis.utils.caches.SoftCachedMap import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment +import kotlin.reflect.KClass @OptIn(KtAnalysisApiInternals::class) -class KtFirAnalysisSessionProvider(project: Project) : CachingKtAnalysisSessionProvider(project) { - override fun getFirResolveSession(contextModule: KtModule): LLFirResolveSession { - return contextModule.getFirResolveSession(project) +class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider(project) { + private val cache = KtAnalysisSessionCache(project) + + override fun getAnalysisSession(useSiteKtElement: KtElement, factory: KtLifetimeTokenFactory): KtAnalysisSession { + return getAnalysisSessionByUseSiteKtModule(useSiteKtElement.getKtModule(project), factory) } - override fun createAnalysisSession( - firResolveSession: LLFirResolveSession, - token: KtLifetimeToken, - ): KtAnalysisSession = KtFirAnalysisSession.createAnalysisSessionByFirResolveSession(firResolveSession, token) + override fun getAnalysisSessionByUseSiteKtModule(useSiteKtModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession { + return cache.getAnalysisSession(useSiteKtModule to factory.identifier) { + val firResolveSession = useSiteKtModule.getFirResolveSession(project) + val validityToken = factory.create(project) + KtFirAnalysisSession.createAnalysisSessionByFirResolveSession(firResolveSession, validityToken) + } + } + + @TestOnly + override fun clearCaches() { + cache.clear() + } } +private class KtAnalysisSessionCache(project: Project) { + private val cache = SoftCachedMap.create>, KtAnalysisSession>( + project, + SoftCachedMap.Kind.STRONG_KEYS_SOFT_VALUES, + listOf( + PsiModificationTracker.MODIFICATION_COUNT, + ProjectRootModificationTracker.getInstance(project), + project.createProjectWideOutOfBlockModificationTracker() + ) + ) + init { + LowMemoryWatcher.register({ cache.clearCachedValues() }, project) + } + + @TestOnly + fun clear() { + cache.clear() + } + + fun getAnalysisSession(key: Pair>, create: () -> KtAnalysisSession): KtAnalysisSession { + return cache.getOrPut(key) { create() } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt deleted file mode 100644 index 07432345f88..00000000000 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2010-2021 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.analysis.api.impl.base - -import com.intellij.openapi.project.Project -import com.intellij.openapi.roots.ProjectRootModificationTracker -import com.intellij.openapi.util.LowMemoryWatcher -import com.intellij.psi.util.PsiModificationTracker -import org.jetbrains.annotations.TestOnly -import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals -import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenFactory -import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider -import org.jetbrains.kotlin.analysis.project.structure.KtModule -import org.jetbrains.kotlin.analysis.project.structure.getKtModule -import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker -import org.jetbrains.kotlin.analysis.utils.caches.SoftCachedMap -import org.jetbrains.kotlin.psi.KtElement -import kotlin.reflect.KClass - -@KtAnalysisApiInternals -abstract class CachingKtAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider(project) { - private val cache = KtAnalysisSessionCache(project) - - protected abstract fun getFirResolveSession(contextModule: KtModule): State - - protected abstract fun createAnalysisSession( - firResolveSession: State, - token: KtLifetimeToken, - ): KtAnalysisSession - - final override fun getAnalysisSession(useSiteKtElement: KtElement, factory: KtLifetimeTokenFactory): KtAnalysisSession { - return getAnalysisSessionByUseSiteKtModule(useSiteKtElement.getKtModule(project), factory) - } - - final override fun getAnalysisSessionByUseSiteKtModule(useSiteKtModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession { - return cache.getAnalysisSession(useSiteKtModule to factory.identifier) { - val firResolveSession = getFirResolveSession(useSiteKtModule) - val validityToken = factory.create(project) - createAnalysisSession(firResolveSession, validityToken) - } - } - - @TestOnly - final override fun clearCaches() { - cache.clear() - } -} - -private class KtAnalysisSessionCache(project: Project) { - private val cache = SoftCachedMap.create>, KtAnalysisSession>( - project, - SoftCachedMap.Kind.STRONG_KEYS_SOFT_VALUES, - listOf( - PsiModificationTracker.MODIFICATION_COUNT, - ProjectRootModificationTracker.getInstance(project), - project.createProjectWideOutOfBlockModificationTracker() - ) - ) - - init { - LowMemoryWatcher.register({ cache.clearCachedValues() }, project) - } - - @TestOnly - fun clear() { - cache.clear() - } - - fun getAnalysisSession( - key: Pair>, - create: () -> KtAnalysisSession - ): KtAnalysisSession = - cache.getOrPut(key) { create() } -} \ No newline at end of file