[LL FIR] KTIJ-24296 LL FIR symbol provider: Remove function class check

- `LLFirProvider$SymbolProvider` cannot provide synthetic function
  classes, so there is no need to check `isNameForFunctionClass` for the
  `ClassId`.
This commit is contained in:
Marco Pennekamp
2023-03-14 15:09:12 +01:00
committed by Space Team
parent 32297c0f21
commit bf1ee6ebed
2 changed files with 6 additions and 22 deletions
@@ -109,7 +109,7 @@ internal class LLFirProvider(
@NoMutableState
private inner class SymbolProvider : FirSymbolProvider(session) {
override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? {
if (!providerHelper.symbolNameCache.mayHaveTopLevelClassifier(classId)) return null
if (!providerHelper.symbolNameCache.mayHaveTopLevelClassifier(classId, mayHaveFunctionClass = false)) return null
return getFirClassifierByFqName(classId)?.symbol
}
@@ -153,7 +153,7 @@ internal class LLFirProvider(
override fun computePackageSetWithTopLevelCallables(): Set<String>? = null
override fun knownTopLevelClassifiersInPackage(packageFqName: FqName): Set<String>? =
providerHelper.symbolNameCache.getTopLevelClassifierNamesInPackage(packageFqName)?.names
providerHelper.symbolNameCache.getTopLevelClassifierNamesInPackage(packageFqName)
override fun computeCallableNamesInPackage(packageFqName: FqName): Set<Name>? =
providerHelper.symbolNameCache.getTopLevelCallableNamesInPackage(packageFqName)
@@ -10,7 +10,6 @@ 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.mayHaveTopLevelClassifier
import org.jetbrains.kotlin.fir.types.functionTypeService
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -20,38 +19,23 @@ import org.jetbrains.kotlin.name.Name
* 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 data class ClassifierNamesInPackage(
val names: Set<String>,
/**
* Some packages (such as `kotlin` or `kotlin.coroutines`) may contain function classes generated by the compiler. To avoid a hash
* map access when checking `mayHaveTopLevelClassifier`, [mayHaveFunctionClass] is precomputed for each package name. Also see
* [org.jetbrains.kotlin.builtins.functions.FunctionTypeKind].
*/
val mayHaveFunctionClass: Boolean,
)
abstract fun computeClassifierNames(packageFqName: FqName): Set<String>?
abstract fun computeCallableNames(packageFqName: FqName): Set<Name>?
private val topLevelClassifierNamesByPackage =
firSession.firCachesFactory.createCache<FqName, ClassifierNamesInPackage?> { packageFqName ->
val names = computeClassifierNames(packageFqName) ?: return@createCache null
val mayHaveFunctionClass = firSession.functionTypeService.hasKindWithSpecificPackage(packageFqName)
ClassifierNamesInPackage(names, mayHaveFunctionClass)
}
firSession.firCachesFactory.createCache<FqName, Set<String>?>(::computeClassifierNames)
private val topLevelCallableNamesByPackage =
firSession.firCachesFactory.createCache<FqName, Set<Name>?>(::computeCallableNames)
fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): ClassifierNamesInPackage? =
fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? =
topLevelClassifierNamesByPackage.getValue(packageFqName)
fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? =
topLevelCallableNamesByPackage.getValue(packageFqName)
fun mayHaveTopLevelClassifier(classId: ClassId): Boolean {
val (names, mayHaveFunctionClass) = getTopLevelClassifierNamesInPackage(classId.packageFqName) ?: return true
fun mayHaveTopLevelClassifier(classId: ClassId, mayHaveFunctionClass: Boolean): Boolean {
val names = getTopLevelClassifierNamesInPackage(classId.packageFqName) ?: return true
return names.mayHaveTopLevelClassifier(classId, firSession, mayHaveFunctionClass)
}