[Analysis API] Add a Caffeine cache to store computer resolution scopes in `KaBaseResolutionScopeProvider`

^KT-77135
diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/projectStructure/KaBaseResolutionScopeProvider.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/projectStructure/KaBaseResolutionScopeProvider.kt
index 59a183b..29d9b44 100644
--- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/projectStructure/KaBaseResolutionScopeProvider.kt
+++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/projectStructure/KaBaseResolutionScopeProvider.kt
@@ -5,21 +5,27 @@
 
 package org.jetbrains.kotlin.analysis.api.impl.base.projectStructure
 
+import com.github.benmanes.caffeine.cache.Cache
+import com.github.benmanes.caffeine.cache.Caffeine
 import com.intellij.openapi.project.Project
 import com.intellij.psi.search.GlobalSearchScope
+import org.jetbrains.kotlin.analysis.api.platform.caches.getOrPut
+import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KaGlobalSearchScopeMerger
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KaResolutionScope
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KaResolutionScopeProvider
-import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KaGlobalSearchScopeMerger
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaBuiltinsModule
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibrarySourceModule
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
 import org.jetbrains.kotlin.analysis.decompiler.psi.BuiltinsVirtualFileProvider
+import java.time.Duration
 
 class KaBaseResolutionScopeProvider : KaResolutionScopeProvider {
     override fun getResolutionScope(module: KaModule): KaResolutionScope {
-        val analyzableModules = getAnalyzableModules(module)
-        val searchScope = buildSearchScope(module, analyzableModules)
-        return KaBaseResolutionScope(module, searchScope, analyzableModules)
+        return resolutionScopeCache.getOrPut(module) { module ->
+            val analyzableModules = getAnalyzableModules(module)
+            val searchScope = buildSearchScope(module, analyzableModules)
+            KaBaseResolutionScope(module, searchScope, analyzableModules)
+        }
     }
 
     private fun getAnalyzableModules(module: KaModule): Set<KaModule> =
@@ -50,4 +56,7 @@
     private fun createBuiltinsScope(project: Project): GlobalSearchScope {
         return BuiltinsVirtualFileProvider.getInstance().createBuiltinsScope(project)
     }
+
+    private val resolutionScopeCache: Cache<KaModule, KaResolutionScope> =
+        Caffeine.newBuilder().weakKeys().softValues().expireAfterAccess(Duration.ofSeconds(10)).build()
 }