diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt index 005e1e1d816..11d5ca5209e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt @@ -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? = null override fun knownTopLevelClassifiersInPackage(packageFqName: FqName): Set? = - providerHelper.symbolNameCache.getTopLevelClassifierNamesInPackage(packageFqName)?.names + providerHelper.symbolNameCache.getTopLevelClassifierNamesInPackage(packageFqName) override fun computeCallableNamesInPackage(packageFqName: FqName): Set? = providerHelper.symbolNameCache.getTopLevelCallableNamesInPackage(packageFqName) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt index 7cb05268e49..1ca31b265f4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt @@ -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, - - /** - * 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? abstract fun computeCallableNames(packageFqName: FqName): Set? private val topLevelClassifierNamesByPackage = - firSession.firCachesFactory.createCache { packageFqName -> - val names = computeClassifierNames(packageFqName) ?: return@createCache null - val mayHaveFunctionClass = firSession.functionTypeService.hasKindWithSpecificPackage(packageFqName) - ClassifierNamesInPackage(names, mayHaveFunctionClass) - } + firSession.firCachesFactory.createCache?>(::computeClassifierNames) private val topLevelCallableNamesByPackage = firSession.firCachesFactory.createCache?>(::computeCallableNames) - fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): ClassifierNamesInPackage? = + fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set? = topLevelClassifierNamesByPackage.getValue(packageFqName) fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set? = 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) }