[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:
committed by
Space Team
parent
32297c0f21
commit
bf1ee6ebed
+2
-2
@@ -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)
|
||||
|
||||
+4
-20
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user