diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCache.kt index 464ebccba0d..f0bc9ead96c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCache.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCache.kt @@ -9,9 +9,9 @@ import org.jetbrains.kotlin.fir.caches.FirCache import java.util.concurrent.ConcurrentHashMap internal class FirThreadSafeCache( + private val map: ConcurrentHashMap = ConcurrentHashMap(), private val createValue: (K, CONTEXT) -> V ) : FirCache() { - private val map = ConcurrentHashMap() override fun getValue(key: K, context: CONTEXT): V = map.getOrPutWithNullableValue(key) { createValue(it, context) } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCachesFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCachesFactory.kt index 6622102a891..b1fe5ecedb2 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCachesFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCachesFactory.kt @@ -5,11 +5,24 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.fir.caches -import org.jetbrains.kotlin.fir.caches.* +import org.jetbrains.kotlin.fir.caches.FirCache +import org.jetbrains.kotlin.fir.caches.FirCachesFactory +import java.util.concurrent.ConcurrentHashMap object FirThreadSafeCachesFactory : FirCachesFactory() { override fun createCache(createValue: (KEY, CONTEXT) -> VALUE): FirCache = - FirThreadSafeCache(createValue) + FirThreadSafeCache(createValue = createValue) + + override fun createCache( + initialCapacity: Int, + loadFactor: Float, + createValue: (K, CONTEXT) -> V + ): FirCache = + FirThreadSafeCache( + ConcurrentHashMap(initialCapacity, loadFactor), + createValue + ) + override fun createCacheWithPostCompute( createValue: (KEY, CONTEXT) -> Pair, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/FirCachesFactory.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/FirCachesFactory.kt index c247251a05c..0bdecd9af3d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/FirCachesFactory.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/FirCachesFactory.kt @@ -20,6 +20,24 @@ abstract class FirCachesFactory : FirSessionComponent { */ abstract fun createCache(createValue: (K, CONTEXT) -> V): FirCache + /** + * Creates a cache with returns a value by key on demand if it is computed + * Otherwise computes the value in [createValue] and caches it for future invocations + * + * [FirCache.getValue] should not be called inside [createValue] + * + * Where: + * [CONTEXT] -- type of value which be used to create value by [createValue] + * + * @param initialCapacity initial capacity for the underlying cache map + * @param loadFactor loadFactor for the underlying cache map + */ + abstract fun createCache( + initialCapacity: Int, + loadFactor: Float, + createValue: (K, CONTEXT) -> V + ): FirCache + /** * Creates a cache with returns a caches value on demand if it is computed * Otherwise computes the value in two phases: diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/FirThreadUnsafeCachesFactory.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/FirThreadUnsafeCachesFactory.kt index 7c166625ac8..322aa857cac 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/FirThreadUnsafeCachesFactory.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/FirThreadUnsafeCachesFactory.kt @@ -7,7 +7,17 @@ package org.jetbrains.kotlin.fir.caches object FirThreadUnsafeCachesFactory : FirCachesFactory() { override fun createCache(createValue: (K, CONTEXT) -> V): FirCache = - FirThreadUnsafeCache(createValue) + FirThreadUnsafeCache(createValue = createValue) + + override fun createCache( + initialCapacity: Int, + loadFactor: Float, + createValue: (K, CONTEXT) -> V + ): FirCache = + FirThreadUnsafeCache( + NullableMap(HashMap(initialCapacity, loadFactor)), + createValue + ) override fun createCacheWithPostCompute( createValue: (K, CONTEXT) -> Pair, @@ -18,9 +28,9 @@ object FirThreadUnsafeCachesFactory : FirCachesFactory() { @Suppress("UNCHECKED_CAST") private class FirThreadUnsafeCache( + private val map: NullableMap = NullableMap(), private val createValue: (K, CONTEXT) -> V ) : FirCache() { - private val map = NullableMap() override fun getValue(key: K, context: CONTEXT): V = map.getOrElse(key) {