From 9dcc9d0d102e4979f287144202628bae61539ba5 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 17 Apr 2023 16:58:37 +0200 Subject: [PATCH] [LL FIR] introduce LLFirCompositeSymbolProviderNameCache ^KT-57930 --- .../fir/util/LLFirSymbolProviderNameCache.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt index 08f6a0c0326..5c2925e0d99 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.caches.createCache import org.jetbrains.kotlin.fir.caches.firCachesFactory import org.jetbrains.kotlin.fir.caches.getValue +import org.jetbrains.kotlin.fir.resolve.providers.flatMapToNullableSet import org.jetbrains.kotlin.fir.resolve.providers.mayHaveTopLevelClassifier import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -58,3 +59,42 @@ internal abstract class LLFirSymbolProviderNameCacheBase( return name in names } } + + +internal object LLFirEmptySymbolProviderNameCache : LLFirSymbolProviderNameCache() { + override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set? = emptySet() + override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set? = emptySet() + override fun mayHaveTopLevelClassifier(classId: ClassId, mayHaveFunctionClass: Boolean): Boolean = false + override fun mayHaveTopLevelCallable(packageFqName: FqName, name: Name): Boolean = false +} + +internal class LLFirCompositeSymbolProviderNameCache +private constructor( + private val caches: List +) : LLFirSymbolProviderNameCache() { + override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set? { + return caches.flatMapToNullableSet { it.getTopLevelClassifierNamesInPackage(packageFqName) } + } + + override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set? { + return caches.flatMapToNullableSet { it.getTopLevelCallableNamesInPackage(packageFqName) } + } + + override fun mayHaveTopLevelClassifier(classId: ClassId, mayHaveFunctionClass: Boolean): Boolean { + return caches.any { it.mayHaveTopLevelClassifier(classId, mayHaveFunctionClass) } + } + + override fun mayHaveTopLevelCallable(packageFqName: FqName, name: Name): Boolean { + return caches.any { it.mayHaveTopLevelCallable(packageFqName, name) } + } + + companion object { + fun create(caches: List): LLFirSymbolProviderNameCache { + return when (caches.size) { + 0 -> LLFirEmptySymbolProviderNameCache + 1 -> caches.single() + else -> LLFirCompositeSymbolProviderNameCache(caches) + } + } + } +} \ No newline at end of file