From 3b681cd2eb6bb25bad0d85b01df8ace491917187 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 8 Apr 2023 15:53:45 +0200 Subject: [PATCH] [LL FIR] extract base class from LLFirSymbolProviderNameCache ^KT-57930 --- .../LLFirCombinedKotlinSymbolProvider.kt | 4 ++-- .../LLFirKotlinSymbolProviderNameCache.kt | 2 +- .../fir/util/LLFirSymbolProviderNameCache.kt | 23 +++++++++++++++---- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt index 9bb9938b70e..cd55c44e515 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt @@ -9,7 +9,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.NullableCaffeineCache import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirSymbolProviderNameCache +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirSymbolProviderNameCacheBase import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.getKtModule import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider @@ -46,7 +46,7 @@ internal class LLFirCombinedKotlinSymbolProvider private constructor( providers: List, private val declarationProvider: KotlinDeclarationProvider, ) : LLFirSelectingCombinedSymbolProvider(session, project, providers) { - private val symbolNameCache = object : LLFirSymbolProviderNameCache(session) { + private val symbolNameCache = object : LLFirSymbolProviderNameCacheBase(session) { override fun computeClassifierNames(packageFqName: FqName): Set? = buildSet { providers.forEach { addAll(it.knownTopLevelClassifiersInPackage(packageFqName) ?: return null) } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolProviderNameCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolProviderNameCache.kt index 0877ed5fbda..87b9555473d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolProviderNameCache.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolProviderNameCache.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.name.Name internal class LLFirKotlinSymbolProviderNameCache( firSession: FirSession, private val declarationProvider: KotlinDeclarationProvider, -) : LLFirSymbolProviderNameCache(firSession) { +) : LLFirSymbolProviderNameCacheBase(firSession) { override fun computeClassifierNames(packageFqName: FqName): Set = declarationProvider .getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName) 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 1ca31b265f4..08f6a0c0326 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 @@ -18,7 +18,20 @@ import org.jetbrains.kotlin.name.Name * Caches the names of classifiers and callables contained in a package. [LLFirSymbolProviderNameCache] is used by symbol providers to abort * symbol finding early if the symbol name isn't contained in the symbol provider's domain. */ -internal abstract class LLFirSymbolProviderNameCache(private val firSession: FirSession) { +internal abstract class LLFirSymbolProviderNameCache { + abstract fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set? + + abstract fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set? + + abstract fun mayHaveTopLevelClassifier(classId: ClassId, mayHaveFunctionClass: Boolean): Boolean + + abstract fun mayHaveTopLevelCallable(packageFqName: FqName, name: Name): Boolean +} + + +internal abstract class LLFirSymbolProviderNameCacheBase( + private val firSession: FirSession +) : LLFirSymbolProviderNameCache() { abstract fun computeClassifierNames(packageFqName: FqName): Set? abstract fun computeCallableNames(packageFqName: FqName): Set? @@ -28,18 +41,18 @@ internal abstract class LLFirSymbolProviderNameCache(private val firSession: Fir private val topLevelCallableNamesByPackage = firSession.firCachesFactory.createCache?>(::computeCallableNames) - fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set? = + final override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set? = topLevelClassifierNamesByPackage.getValue(packageFqName) - fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set? = + final override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set? = topLevelCallableNamesByPackage.getValue(packageFqName) - fun mayHaveTopLevelClassifier(classId: ClassId, mayHaveFunctionClass: Boolean): Boolean { + final override fun mayHaveTopLevelClassifier(classId: ClassId, mayHaveFunctionClass: Boolean): Boolean { val names = getTopLevelClassifierNamesInPackage(classId.packageFqName) ?: return true return names.mayHaveTopLevelClassifier(classId, firSession, mayHaveFunctionClass) } - fun mayHaveTopLevelCallable(packageFqName: FqName, name: Name): Boolean { + override fun mayHaveTopLevelCallable(packageFqName: FqName, name: Name): Boolean { if (name.isSpecial) return true val names = getTopLevelCallableNamesInPackage(packageFqName) ?: return true return name in names