~ caches at FirDependenciesSymbolProviderImpl
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt
index a764d50..2174435 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt
@@ -81,6 +81,22 @@
 
     fun getPackageWithoutDependencies(fqName: FqName): FqName? =
         providers.firstNotNullOfOrNull { it.getPackage(fqName) }
+
+    override fun computePackageSet(): Set<String> {
+        TODO("Not yet implemented")
+    }
+
+    override fun mayHaveTopLevelClass(classId: ClassId): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun computeCallableNames(fqName: FqName): Set<Name>? {
+        TODO("Not yet implemented")
+    }
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> {
+        TODO("Not yet implemented")
+    }
 }
 
 internal abstract class LLFirDependentModuleProviders(
@@ -178,6 +194,21 @@
         return jvmPackagePartSource.facadeClassName ?: jvmPackagePartSource.className
     }
 
+    override fun computePackageSet(): Set<String> {
+        TODO("Not yet implemented")
+    }
+
+    override fun mayHaveTopLevelClass(classId: ClassId): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun computeCallableNames(fqName: FqName): Set<Name>? {
+        TODO("Not yet implemented")
+    }
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> {
+        TODO("Not yet implemented")
+    }
 }
 
 internal class LLFirDependentModuleProvidersBySessions(
@@ -191,6 +222,10 @@
 
     constructor(session: FirSession, createSessions: MutableList<LLFirSession>.() -> Unit)
             : this(session, buildList { createSessions() })
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> {
+        TODO("Not yet implemented")
+    }
 }
 
 
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 57828da..52ef2a8 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
@@ -116,5 +116,21 @@
         override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? {
             return getFirClassifierByFqName(classId)?.symbol
         }
+
+        override fun computePackageSet(): Set<String> {
+            TODO("Not yet implemented")
+        }
+
+        override fun mayHaveTopLevelClass(classId: ClassId): Boolean {
+            TODO("Not yet implemented")
+        }
+
+        override fun computeCallableNames(fqName: FqName): Set<Name>? {
+            TODO("Not yet implemented")
+        }
+
+        override fun knownTopLevelClassifiers(fqName: FqName): Set<String> {
+            TODO("Not yet implemented")
+        }
     }
 }
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedSymbolProvider.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedSymbolProvider.kt
index 8881cd0..6f08ef7 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedSymbolProvider.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedSymbolProvider.kt
@@ -101,6 +101,10 @@
 
     override fun mayHaveTopLevelClass(classId: ClassId) = true
 
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> {
+        TODO("Not yet implemented")
+    }
+
     @OptIn(SymbolInternals::class)
     override fun extractClassMetadata(classId: ClassId, parentContext: FirDeserializationContext?): ClassMetadataFindResult? {
         val packageStringName = classId.packageFqName.asString()
diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt
index b60c61c..35f51edd 100644
--- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt
+++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt
@@ -73,22 +73,24 @@
 ) : FirSymbolProvider(session) {
     // ------------------------ Caches ------------------------
 
-    private val packageNames by lazy {
+    protected val packageNames: Set<String> by lazy {
         computePackageSet()
     }
 
-    private val typeAliasesNamesByPackage: FirCache<FqName, Set<Name>, Nothing?> =
+    protected val typeAliasesNamesByPackage: FirCache<FqName, Set<Name>, Nothing?> =
         session.firCachesFactory.createCache { fqName: FqName ->
             getPackageParts(fqName).flatMapTo(mutableSetOf()) { it.typeAliasNameIndex.keys }
         }
 
     private val allNamesByPackage: FirCache<FqName, Set<Name>, Nothing?> =
         session.firCachesFactory.createCache { fqName: FqName ->
-            getPackageParts(fqName).flatMapTo(mutableSetOf()) {
-                it.topLevelFunctionNameIndex.keys + it.topLevelPropertyNameIndex.keys
-            }
+            computeCallableNames(fqName)
         }
 
+    override fun computeCallableNames(fqName: FqName): Set<Name> = getPackageParts(fqName).flatMapTo(mutableSetOf()) {
+        it.topLevelFunctionNameIndex.keys + it.topLevelPropertyNameIndex.keys
+    }
+
     private val packagePartsCache = session.firCachesFactory.createCache(::tryComputePackagePartInfos)
     private val typeAliasCache = session.firCachesFactory.createCache(::findAndDeserializeTypeAlias)
     private val classCache: FirCache<ClassId, FirRegularClassSymbol?, FirDeserializationContext?> =
@@ -107,9 +109,7 @@
     // ------------------------ Abstract members ------------------------
 
     protected abstract fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData>
-    protected abstract fun computePackageSet(): Set<String>
 
-    protected abstract fun mayHaveTopLevelClass(classId: ClassId): Boolean
 
     protected abstract fun extractClassMetadata(
         classId: ClassId,
diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt
index 054d7c2..d146bf2 100644
--- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt
+++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt
@@ -96,6 +96,17 @@
         }
     }
 
+    override fun computePackageSet(): Set<String> = allPackageFragments.keys.mapTo(mutableSetOf()) { it.asString() }
+    override fun mayHaveTopLevelClass(classId: ClassId): Boolean =
+        allPackageFragments[classId.packageFqName]?.any { classId in it.classDataFinder.allClassIds } == true
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> = allPackageFragments[fqName]?.flatMapTo(mutableSetOf()) {
+        it.classDataFinder.allClassIds.filter { !it.isNestedClass }.map { it.shortClassName.asString() }
+    } ?: emptySet()
+
+    override fun computeCallableNames(fqName: FqName): Set<Name> =
+        allPackageFragments[fqName]?.flatMapTo(mutableSetOf()) { it.getAllCallableNames() } ?: emptySet()
+
     @FirSymbolProviderInternals
     override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {
     }
@@ -154,6 +165,11 @@
             return getTopLevelFunctionSymbols(name)
         }
 
+        fun getAllCallableNames(): Set<Name> = buildSet {
+            packageProto.`package`.functionList.mapTo(this) { nameResolver.getName(it.name) } +
+                    packageProto.`package`.propertyList.mapTo(this) { nameResolver.getName(it.name) }
+        }
+
         fun getTopLevelFunctionSymbols(name: Name): List<FirNamedFunctionSymbol> {
             return packageProto.`package`.functionList.filter { nameResolver.getName(it.name) == name }.map {
                 memberDeserializer.loadFunction(it).symbol
diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt
index ebd026e..971e6ce 100644
--- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt
+++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt
@@ -92,6 +92,8 @@
         return classId.relativeClassName.topLevelName() in knownNames
     }
 
+    fun knownTopLevelClassifiers(fqName: FqName): Set<String> = knownClassNamesInPackage.getValue(fqName)!!
+
     abstract fun getModuleDataForClass(javaClass: JavaClass): FirModuleData
 
     private fun JavaTypeParameter.toFirTypeParameter(
diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt
index c3467ce..cb468c3 100644
--- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt
+++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt
@@ -48,6 +48,13 @@
     private fun getFirJavaClass(classId: ClassId): FirRegularClassSymbol? =
         classCache.getValue(classId, classId.outerClassId?.let { getFirJavaClass(it) })
 
+    override fun computePackageSet(): Set<String> = emptySet()
+    override fun mayHaveTopLevelClass(classId: ClassId): Boolean = javaFacade.hasTopLevelClassOf(classId)
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> = javaFacade.knownTopLevelClassifiers(fqName)
+
+    override fun computeCallableNames(fqName: FqName): Set<Name> = emptySet()
+
     @OptIn(FirSymbolProviderInternals::class)
     override fun getTopLevelCallableSymbolsTo(destination: MutableList<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {}
 
diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt
index 80321f1..ded6c4a 100644
--- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt
+++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt
@@ -9,6 +9,7 @@
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.ThreadSafeMutableState
 import org.jetbrains.kotlin.fir.caches.firCachesFactory
+import org.jetbrains.kotlin.fir.caches.getValue
 import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
 import org.jetbrains.kotlin.fir.declarations.getDeprecationsProvider
 import org.jetbrains.kotlin.fir.deserialization.*
@@ -95,6 +96,11 @@
 
     override fun mayHaveTopLevelClass(classId: ClassId): Boolean = javaFacade.hasTopLevelClassOf(classId)
 
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> {
+        if (fqName.asString() !in packageNames) return javaFacade.knownTopLevelClassifiers(fqName)
+        return javaFacade.knownTopLevelClassifiers(fqName) + typeAliasesNamesByPackage.getValue(fqName).map { it.asString() }
+    }
+
     private val KotlinJvmBinaryClass.incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>?
         get() {
             // TODO: skipMetadataVersionCheck
diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/OptionalAnnotationClassesProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/OptionalAnnotationClassesProvider.kt
index fb35d2d..f28ae9a 100644
--- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/OptionalAnnotationClassesProvider.kt
+++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/OptionalAnnotationClassesProvider.kt
@@ -53,6 +53,8 @@
 
     override fun mayHaveTopLevelClass(classId: ClassId): Boolean = true
 
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> = emptySet()
+
     override fun extractClassMetadata(
         classId: ClassId,
         parentContext: FirDeserializationContext?
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/extensions/FirExtensionDeclarationsSymbolProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/extensions/FirExtensionDeclarationsSymbolProvider.kt
index 3aa8108..f6344f6 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/extensions/FirExtensionDeclarationsSymbolProvider.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/extensions/FirExtensionDeclarationsSymbolProvider.kt
@@ -59,6 +59,14 @@
             extensions.flatGroupBy { it.topLevelClassIdsCache.getValue() }
         }
 
+    override fun computePackageSet(): Set<String> = emptySet()
+
+    override fun mayHaveTopLevelClass(classId: ClassId) = false
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> = emptySet()
+
+    override fun computeCallableNames(fqName: FqName): Set<Name> = emptySet()
+
     private val extensionsByNestedClassifierClassId: FirCache<ClassId, Map<ClassId, List<FirDeclarationGenerationExtension>>, Nothing?> =
         session.firCachesFactory.createCache cache@{ outerClassId, _ ->
             val outerClassSymbol = session.symbolProvider.getClassLikeSymbolByClassId(outerClassId) as? FirClassSymbol<*>
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/extensions/FirSwitchableExtensionDeclarationsSymbolProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/extensions/FirSwitchableExtensionDeclarationsSymbolProvider.kt
index 9c7f7be..4b7241b 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/extensions/FirSwitchableExtensionDeclarationsSymbolProvider.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/extensions/FirSwitchableExtensionDeclarationsSymbolProvider.kt
@@ -71,6 +71,15 @@
     fun enable() {
         disabled = false
     }
+
+
+    override fun computePackageSet(): Set<String> = emptySet()
+
+    override fun mayHaveTopLevelClass(classId: ClassId) = false
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> = emptySet()
+
+    override fun computeCallableNames(fqName: FqName): Set<Name> = emptySet()
 }
 
 val FirSession.generatedDeclarationsSymbolProvider: FirSwitchableExtensionDeclarationsSymbolProvider? by FirSession.nullableSessionComponentAccessor()
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt
index 61b361d..fac4d7b 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt
@@ -52,6 +52,13 @@
     @FirSymbolProviderInternals
     abstract fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name)
 
+    abstract fun computePackageSet(): Set<String>
+
+    abstract fun mayHaveTopLevelClass(classId: ClassId): Boolean
+
+    abstract fun knownTopLevelClassifiers(fqName: FqName): Set<String>
+    abstract fun computeCallableNames(fqName: FqName): Set<Name>?
+
     abstract fun getPackage(fqName: FqName): FqName? // TODO: Replace to symbol sometime
 }
 
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCompositeSymbolProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCompositeSymbolProvider.kt
index 9fbd60c..612cce1 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCompositeSymbolProvider.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCompositeSymbolProvider.kt
@@ -49,4 +49,13 @@
     override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? {
         return providers.firstNotNullOfOrNull { it.getClassLikeSymbolByClassId(classId) }
     }
+
+    override fun computePackageSet(): Set<String> = providers.flatMapTo(mutableSetOf()) { it.computePackageSet() }
+
+    override fun mayHaveTopLevelClass(classId: ClassId) = providers.any { it.mayHaveTopLevelClass(classId) }
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> = providers.flatMapTo(mutableSetOf()) { it.knownTopLevelClassifiers(fqName) }
+
+    override fun computeCallableNames(fqName: FqName): Set<Name> =
+        providers.flatMapTo(mutableSetOf()) { it.computeCallableNames(fqName)!! }
 }
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt
index 9f8d9ce..052fd4e 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt
@@ -5,8 +5,10 @@
 
 package org.jetbrains.kotlin.fir.resolve.providers.impl
 
+import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.ThreadSafeMutableState
+import org.jetbrains.kotlin.fir.caches.FirCache
 import org.jetbrains.kotlin.fir.caches.createCache
 import org.jetbrains.kotlin.fir.caches.firCachesFactory
 import org.jetbrains.kotlin.fir.caches.getValue
@@ -29,6 +31,17 @@
     private val topLevelPropertyCache = session.firCachesFactory.createCache(::computeTopLevelProperties)
     private val packageCache = session.firCachesFactory.createCache(::computePackage)
 
+    private val allPackageNames by lazy {
+        computePackageSet()
+    }
+
+    private val callableNames = session.firCachesFactory.createCache { fqName: FqName ->
+        computeCallableNames(fqName)
+    }
+
+    private val knownClassNamesInPackage: FirCache<FqName, Set<String>, Nothing?> = session.firCachesFactory.createCache { fqName: FqName ->
+        knownTopLevelClassifiers(fqName)
+    }
 
     protected open val dependencyProviders by lazy {
         val moduleData =
@@ -99,11 +112,18 @@
 
     @FirSymbolProviderInternals
     override fun getTopLevelFunctionSymbolsTo(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {
+        if (!mayBeCallables(packageFqName, name)) return
         destination += topLevelFunctionCache.getValue(CallableId(packageFqName, name))
     }
 
+    private fun mayBeCallables(fqName: FqName, name: Name): Boolean {
+        if (fqName.asString() !in allPackageNames) return false
+        return name in callableNames.getValue(fqName)
+    }
+
     @FirSymbolProviderInternals
     override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {
+        if (!mayBeCallables(packageFqName, name)) return
         destination += topLevelPropertyCache.getValue(CallableId(packageFqName, name))
     }
 
@@ -113,14 +133,38 @@
     }
 
     override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> {
+        if (!mayBeCallables(packageFqName, name)) return emptyList()
         return topLevelCallableCache.getValue(CallableId(packageFqName, name))
     }
 
     override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? {
+        val parentClassId = classId.outerClassId
+
+        if (parentClassId == null && !mayHaveTopLevelClass1(classId)) return null
+        if (parentClassId != null && !mayHaveTopLevelClass1(classId.outermostClassId)) return null
+
         return classCache.getValue(classId)
     }
 
     override fun getPackage(fqName: FqName): FqName? {
         return packageCache.getValue(fqName)
     }
+
+
+    override fun computePackageSet(): Set<String> = dependencyProviders.flatMapTo(mutableSetOf()) { it.computePackageSet() }
+
+    override fun mayHaveTopLevelClass(classId: ClassId): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    private fun mayHaveTopLevelClass1(classId: ClassId): Boolean  {
+        if (FunctionClassKind.byClassNamePrefix(classId.packageFqName, classId.shortClassName.asString()) != null) return true
+
+        return classId.shortClassName.asString() in knownClassNamesInPackage.getValue(classId.packageFqName)
+    }
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> = dependencyProviders.flatMapTo(mutableSetOf()) { it.knownTopLevelClassifiers(fqName)}
+
+    override fun computeCallableNames(fqName: FqName): Set<Name> =
+        dependencyProviders.flatMapTo(mutableSetOf()) { it.computeCallableNames(fqName)!! }
 }
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt
index 9901e81..5b5fd7bc 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt
@@ -5,7 +5,6 @@
 
 package org.jetbrains.kotlin.fir.resolve.providers.impl
 
-import org.jetbrains.kotlin.builtins.StandardNames
 import org.jetbrains.kotlin.descriptors.ClassKind
 import org.jetbrains.kotlin.descriptors.Modality
 import org.jetbrains.kotlin.descriptors.Visibilities
@@ -23,7 +22,10 @@
 import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
 import org.jetbrains.kotlin.fir.symbols.impl.*
 import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
-import org.jetbrains.kotlin.name.*
+import org.jetbrains.kotlin.name.ClassId
+import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.name.Name
+import org.jetbrains.kotlin.name.StandardClassIds
 
 @NoMutableState
 class FirCloneableSymbolProvider(
@@ -74,6 +76,15 @@
     override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {
     }
 
+    override fun computePackageSet(): Set<String> = setOf(StandardClassIds.Cloneable.packageFqName.asString())
+
+    override fun mayHaveTopLevelClass(classId: ClassId) = classId == StandardClassIds.Cloneable
+
+    override fun knownTopLevelClassifiers(fqName: FqName): Set<String> =
+        if (fqName == StandardClassIds.Cloneable.packageFqName) setOf(StandardClassIds.Cloneable.shortClassName.asString()) else emptySet()
+
+    override fun computeCallableNames(fqName: FqName): Set<Name> = emptySet()
+
     override fun getPackage(fqName: FqName): FqName? {
         return null
     }
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt
index 110f052..01cfda0 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt
@@ -71,6 +71,18 @@
             destination += (state.propertyMap[CallableId(packageFqName, null, name)] ?: emptyList())
         }
 
+        override fun computePackageSet(): Set<String> = state.allSubPackages.mapTo(mutableSetOf()) { it.asString() }
+
+        override fun mayHaveTopLevelClass(classId: ClassId): Boolean = classId in state.classifierMap
+
+        override fun knownTopLevelClassifiers(fqName: FqName): Set<String> =
+            state.classifierInPackage[fqName].orEmpty().mapTo(mutableSetOf()) { it.asString() }
+
+        override fun computeCallableNames(fqName: FqName): Set<Name> = buildSet {
+            state.functionMap.keys.mapTo(this) { it.callableName }
+            state.propertyMap.keys.mapTo(this) { it.callableName }
+        }
+
         override fun getPackage(fqName: FqName): FqName? {
             if (fqName in state.allSubPackages) return fqName
             return null
@@ -109,6 +121,7 @@
 
             if (!classId.isNestedClass && !classId.isLocal) {
                 data.state.classesInPackage.getOrPut(classId.packageFqName, ::mutableSetOf).add(classId.shortClassName)
+                data.state.classifierInPackage.getOrPut(classId.packageFqName, ::mutableSetOf).add(classId.shortClassName)
             }
 
             regularClass.acceptChildren(this, data)
@@ -120,6 +133,8 @@
             data.state.classifierMap.put(classId, typeAlias)?.let {
                 data.nameConflictsTracker?.registerClassifierRedeclaration(classId, typeAlias.symbol, data.file, it.symbol, prevFile)
             }
+
+            data.state.classifierInPackage.getOrPut(classId.packageFqName, ::mutableSetOf).add(classId.shortClassName)
         }
 
         override fun visitPropertyAccessor(
@@ -171,6 +186,7 @@
         val classifierMap = mutableMapOf<ClassId, FirClassLikeDeclaration>()
         val classifierContainerFileMap = mutableMapOf<ClassId, FirFile>()
         val classesInPackage = mutableMapOf<FqName, MutableSet<Name>>()
+        val classifierInPackage = mutableMapOf<FqName, MutableSet<Name>>()
         val functionMap = mutableMapOf<CallableId, List<FirNamedFunctionSymbol>>()
         val propertyMap = mutableMapOf<CallableId, List<FirPropertySymbol>>()
         val constructorMap = mutableMapOf<CallableId, List<FirConstructorSymbol>>()