[LL FIR] introduce LLFirCompositeSymbolProviderNameCache

^KT-57930
This commit is contained in:
Ilya Kirillov
2023-04-17 16:58:37 +02:00
committed by Space Team
parent 2beb4c0017
commit 9dcc9d0d10
@@ -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<String>? = emptySet()
override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? = 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>
) : LLFirSymbolProviderNameCache() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? {
return caches.flatMapToNullableSet { it.getTopLevelClassifierNamesInPackage(packageFqName) }
}
override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? {
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>): LLFirSymbolProviderNameCache {
return when (caches.size) {
0 -> LLFirEmptySymbolProviderNameCache
1 -> caches.single()
else -> LLFirCompositeSymbolProviderNameCache(caches)
}
}
}
}