~ 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>>()