FIR IDE: use PersistentMap to store FromModuleViewSessionCache mappings

Needed to ensure safe pub of map
This commit is contained in:
Ilya Kirillov
2020-11-27 14:15:44 +01:00
parent 76c0dc7dba
commit 3515cd546d
@@ -7,6 +7,9 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
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 kotlinx.collections.immutable.PersistentMap
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toPersistentMap
import org.jetbrains.kotlin.fir.BuiltinTypes import org.jetbrains.kotlin.fir.BuiltinTypes
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.FirPhaseRunner import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
@@ -50,7 +53,7 @@ private class FromModuleViewSessionCache(
val root: ModuleSourceInfo, val root: ModuleSourceInfo,
) { ) {
@Volatile @Volatile
private var mappings: Map<ModuleSourceInfo, FirSessionWithModificationTracker> = emptyMap() private var mappings: PersistentMap<ModuleSourceInfo, FirSessionWithModificationTracker> = persistentMapOf()
val sessionInvalidator: FirSessionInvalidator = FirSessionInvalidator { session -> val sessionInvalidator: FirSessionInvalidator = FirSessionInvalidator { session ->
mappings[session.moduleInfo]?.invalidate() mappings[session.moduleInfo]?.invalidate()
@@ -61,7 +64,7 @@ private class FromModuleViewSessionCache(
action: (Map<ModuleSourceInfo, FirIdeSourcesSession>) -> Pair<Map<ModuleSourceInfo, FirIdeSourcesSession>, R> action: (Map<ModuleSourceInfo, FirIdeSourcesSession>) -> Pair<Map<ModuleSourceInfo, FirIdeSourcesSession>, R>
): Pair<Map<ModuleSourceInfo, FirIdeSourcesSession>, R> { ): Pair<Map<ModuleSourceInfo, FirIdeSourcesSession>, R> {
val (newMappings, result) = action(getSessions().mapValues { it.value }) 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 return newMappings to result
} }