From 3515cd546d44a3b406aa61f8bcfa96d19c5b3a99 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 27 Nov 2020 14:15:44 +0100 Subject: [PATCH] FIR IDE: use PersistentMap to store FromModuleViewSessionCache mappings Needed to ensure safe pub of map --- .../low/level/api/sessions/FirIdeSessionProviderStorage.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt index 1c11d3e546c..e72bf246b58 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt @@ -7,6 +7,9 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import kotlinx.collections.immutable.PersistentMap +import kotlinx.collections.immutable.persistentMapOf +import kotlinx.collections.immutable.toPersistentMap import org.jetbrains.kotlin.fir.BuiltinTypes import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner @@ -50,7 +53,7 @@ private class FromModuleViewSessionCache( val root: ModuleSourceInfo, ) { @Volatile - private var mappings: Map = emptyMap() + private var mappings: PersistentMap = persistentMapOf() val sessionInvalidator: FirSessionInvalidator = FirSessionInvalidator { session -> mappings[session.moduleInfo]?.invalidate() @@ -61,7 +64,7 @@ private class FromModuleViewSessionCache( action: (Map) -> Pair, R> ): Pair, R> { val (newMappings, result) = action(getSessions().mapValues { it.value }) - mappings = newMappings.mapValues { FirSessionWithModificationTracker(it.value) } + mappings = newMappings.mapValues { FirSessionWithModificationTracker(it.value) }.toPersistentMap() return newMappings to result }