[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 @NoMutableState
private inner class SymbolProvider : FirSymbolProvider(session) { private inner class SymbolProvider : FirSymbolProvider(session) {
override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? { 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 return getFirClassifierByFqName(classId)?.symbol
} }
@@ -153,7 +153,7 @@ internal class LLFirProvider(
override fun computePackageSetWithTopLevelCallables(): Set<String>? = null override fun computePackageSetWithTopLevelCallables(): Set<String>? = null
override fun knownTopLevelClassifiersInPackage(packageFqName: FqName): Set<String>? = override fun knownTopLevelClassifiersInPackage(packageFqName: FqName): Set<String>? =
providerHelper.symbolNameCache.getTopLevelClassifierNamesInPackage(packageFqName)?.names providerHelper.symbolNameCache.getTopLevelClassifierNamesInPackage(packageFqName)
override fun computeCallableNamesInPackage(packageFqName: FqName): Set<Name>? = override fun computeCallableNamesInPackage(packageFqName: FqName): Set<Name>? =
providerHelper.symbolNameCache.getTopLevelCallableNamesInPackage(packageFqName) 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.firCachesFactory
import org.jetbrains.kotlin.fir.caches.getValue import org.jetbrains.kotlin.fir.caches.getValue
import org.jetbrains.kotlin.fir.resolve.providers.mayHaveTopLevelClassifier 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.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name 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. * 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(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 computeClassifierNames(packageFqName: FqName): Set<String>?
abstract fun computeCallableNames(packageFqName: FqName): Set<Name>? abstract fun computeCallableNames(packageFqName: FqName): Set<Name>?
private val topLevelClassifierNamesByPackage = private val topLevelClassifierNamesByPackage =
firSession.firCachesFactory.createCache<FqName, ClassifierNamesInPackage?> { packageFqName -> firSession.firCachesFactory.createCache<FqName, Set<String>?>(::computeClassifierNames)
val names = computeClassifierNames(packageFqName) ?: return@createCache null
val mayHaveFunctionClass = firSession.functionTypeService.hasKindWithSpecificPackage(packageFqName)
ClassifierNamesInPackage(names, mayHaveFunctionClass)
}
private val topLevelCallableNamesByPackage = private val topLevelCallableNamesByPackage =
firSession.firCachesFactory.createCache<FqName, Set<Name>?>(::computeCallableNames) firSession.firCachesFactory.createCache<FqName, Set<Name>?>(::computeCallableNames)
fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): ClassifierNamesInPackage? = fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? =
topLevelClassifierNamesByPackage.getValue(packageFqName) topLevelClassifierNamesByPackage.getValue(packageFqName)
fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? = fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? =
topLevelCallableNamesByPackage.getValue(packageFqName) topLevelCallableNamesByPackage.getValue(packageFqName)
fun mayHaveTopLevelClassifier(classId: ClassId): Boolean { fun mayHaveTopLevelClassifier(classId: ClassId, mayHaveFunctionClass: Boolean): Boolean {
val (names, mayHaveFunctionClass) = getTopLevelClassifierNamesInPackage(classId.packageFqName) ?: return true val names = getTopLevelClassifierNamesInPackage(classId.packageFqName) ?: return true
return names.mayHaveTopLevelClassifier(classId, firSession, mayHaveFunctionClass) return names.mayHaveTopLevelClassifier(classId, firSession, mayHaveFunctionClass)
} }