diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolsProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolsProvider.kt index b3e9fe37188..2930f6646de 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolsProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolsProvider.kt @@ -14,10 +14,7 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.NameResolver -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.name.isOneSegmentFQN +import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.getName @@ -60,6 +57,9 @@ abstract class AbstractFirDeserializedSymbolsProvider( } ) + private val functionCache = session.firCachesFactory.createCache(::loadFunctionsByCallableId) + private val propertyCache = session.firCachesFactory.createCache(::loadPropertiesByCallableId) + // ------------------------ Abstract members ------------------------ protected abstract fun computePackagePartsInfos(packageFqName: FqName): List @@ -131,41 +131,45 @@ abstract class AbstractFirDeserializedSymbolsProvider( return classCache.getValueIfComputed(classId) } - private fun loadFunctionsByName(part: PackagePartsCacheData, name: Name): List { - val functionIds = part.topLevelFunctionNameIndex[name] ?: return emptyList() - return functionIds.map { - part.context.memberDeserializer.loadFunction(part.proto.getFunction(it)).symbol + private fun loadFunctionsByCallableId(callableId: CallableId): List { + return getPackageParts(callableId.packageName).flatMap { part -> + val functionIds = part.topLevelFunctionNameIndex[callableId.callableName] ?: return@flatMap emptyList() + functionIds.map { + part.context.memberDeserializer.loadFunction(part.proto.getFunction(it)).symbol + } } } - private fun loadPropertiesByName(part: PackagePartsCacheData, name: Name): List { - val propertyIds = part.topLevelPropertyNameIndex[name] ?: return emptyList() - return propertyIds.map { - part.context.memberDeserializer.loadProperty(part.proto.getProperty(it)).symbol + private fun loadPropertiesByCallableId(callableId: CallableId): List { + return getPackageParts(callableId.packageName).flatMap { part -> + val propertyIds = part.topLevelPropertyNameIndex[callableId.callableName] ?: return@flatMap emptyList() + propertyIds.map { + part.context.memberDeserializer.loadProperty(part.proto.getProperty(it)).symbol + } } } + private fun getPackageParts(packageFqName: FqName): Collection { + return packagePartsCache.getValue(packageFqName) + } + // ------------------------ SymbolProvider methods ------------------------ @FirSymbolProviderInternals override fun getTopLevelCallableSymbolsTo(destination: MutableList>, packageFqName: FqName, name: Name) { - getPackageParts(packageFqName).flatMapTo(destination) { part -> - loadFunctionsByName(part, name) + loadPropertiesByName(part, name) - } + val callableId = CallableId(packageFqName, name) + destination += functionCache.getValue(callableId) + destination += propertyCache.getValue(callableId) } @FirSymbolProviderInternals override fun getTopLevelFunctionSymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) { - getPackageParts(packageFqName).flatMapTo(destination) { part -> - loadFunctionsByName(part, name) - } + destination += functionCache.getValue(CallableId(packageFqName, name)) } @FirSymbolProviderInternals override fun getTopLevelPropertySymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) { - getPackageParts(packageFqName).flatMapTo(destination) { part -> - loadPropertiesByName(part, name) - } + destination += propertyCache.getValue(CallableId(packageFqName, name)) } override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? { @@ -186,9 +190,5 @@ abstract class AbstractFirDeserializedSymbolsProvider( return typeAliasCache.getValue(classId) } - private fun getPackageParts(packageFqName: FqName): Collection { - return packagePartsCache.getValue(packageFqName) - } - override fun getPackage(fqName: FqName): FqName? = null }