[213] Avoid using ConcurrentCollectionFactory.createConcurrentIdentityMap
The `ConcurrentCollectionFactory` class was moved to the module which is no longer available in the 213 platform distribution `MapMaker().weakKeys().makeMap()` is used as drop-in replacement of concurrent hash map with identity-based equals strategy The new implementation stores keys on weak references, which should not change the behavior of the `ModuleFileCacheImpl`. 1. If someone still has a strong reference to the `ktFile`, then the cache will also keep it. 2. If there are no more strong references to the `ktFile`, then the cache will not hold it from being garbage-collected. However, since nobody has a strong reference to the `ktFile` anymore, nobody can call `fileCached` or `getCachedFirFile` with it, and it will never be requested from the cache. KTI-1114
This commit is contained in:
committed by
Space Team
parent
d4cffb8a5a
commit
fb9de6ba45
+3
-2
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder
|
package org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder
|
||||||
|
|
||||||
import com.intellij.concurrency.ConcurrentCollectionFactory
|
import com.google.common.collect.MapMaker
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.ThreadSafe
|
import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.ThreadSafe
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
|
|||||||
import org.jetbrains.kotlin.fir.psi
|
import org.jetbrains.kotlin.fir.psi
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.concurrent.ConcurrentMap
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Caches mapping [KtFile] -> [FirFile] of module [KtModule]
|
* Caches mapping [KtFile] -> [FirFile] of module [KtModule]
|
||||||
@@ -33,7 +34,7 @@ internal abstract class ModuleFileCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal class ModuleFileCacheImpl(override val moduleComponents: LLFirModuleResolveComponents) : ModuleFileCache() {
|
internal class ModuleFileCacheImpl(override val moduleComponents: LLFirModuleResolveComponents) : ModuleFileCache() {
|
||||||
private val ktFileToFirFile = ConcurrentCollectionFactory.createConcurrentIdentityMap<KtFile, FirFile>()
|
private val ktFileToFirFile: ConcurrentMap<KtFile, FirFile> = MapMaker().weakKeys().makeMap()
|
||||||
override fun fileCached(file: KtFile, createValue: () -> FirFile): FirFile =
|
override fun fileCached(file: KtFile, createValue: () -> FirFile): FirFile =
|
||||||
ktFileToFirFile.computeIfAbsent(file) { createValue() }
|
ktFileToFirFile.computeIfAbsent(file) { createValue() }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user