[LL FIR] extract base class from LLFirSymbolProviderNameCache
^KT-57930
This commit is contained in:
committed by
Space Team
parent
c9d7b47900
commit
3b681cd2eb
+2
-2
@@ -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<LLFirProvider.SymbolProvider>,
|
||||
private val declarationProvider: KotlinDeclarationProvider,
|
||||
) : LLFirSelectingCombinedSymbolProvider<LLFirProvider.SymbolProvider>(session, project, providers) {
|
||||
private val symbolNameCache = object : LLFirSymbolProviderNameCache(session) {
|
||||
private val symbolNameCache = object : LLFirSymbolProviderNameCacheBase(session) {
|
||||
override fun computeClassifierNames(packageFqName: FqName): Set<String>? = buildSet {
|
||||
providers.forEach { addAll(it.knownTopLevelClassifiersInPackage(packageFqName) ?: return null) }
|
||||
}
|
||||
|
||||
+1
-1
@@ -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<String> =
|
||||
declarationProvider
|
||||
.getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName)
|
||||
|
||||
+18
-5
@@ -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<String>?
|
||||
|
||||
abstract fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>?
|
||||
|
||||
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<String>?
|
||||
abstract fun computeCallableNames(packageFqName: FqName): Set<Name>?
|
||||
|
||||
@@ -28,18 +41,18 @@ internal abstract class LLFirSymbolProviderNameCache(private val firSession: Fir
|
||||
private val topLevelCallableNamesByPackage =
|
||||
firSession.firCachesFactory.createCache<FqName, Set<Name>?>(::computeCallableNames)
|
||||
|
||||
fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? =
|
||||
final override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? =
|
||||
topLevelClassifierNamesByPackage.getValue(packageFqName)
|
||||
|
||||
fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? =
|
||||
final override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? =
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user