From c289da6cf36c474040d0345177ca3cd9b86f3fb9 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Tue, 10 Oct 2023 13:20:09 +0200 Subject: [PATCH] [LL FIR] Use `mergePackageProviders` in `LLFirCombinedKotlinSymbolProvider` ^KT-61791 --- .../providers/LLFirCombinedKotlinSymbolProvider.kt | 12 +++++++----- .../low/level/api/fir/providers/providerUtils.kt | 8 -------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt index b3b33898d69..65afaf9e521 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt @@ -10,8 +10,8 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.NullableCaffeineCa import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider -import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.analysis.providers.mergeDeclarationProviders +import org.jetbrains.kotlin.analysis.providers.mergePackageProviders import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.providers.FirCompositeCachedSymbolNamesProvider @@ -129,6 +129,9 @@ internal class LLFirCombinedKotlinSymbolProvider private constructor( } else { packageProvider.doesKotlinOnlyPackageExist(fqName) } + + // Regarding caching `hasPackage`: The static (standalone) package provider precomputes its packages, while the IDE package provider + // caches the results itself. Hence, it's currently unnecessary to provide another layer of caching here. return fqName.takeIf { hasPackage } } @@ -137,14 +140,13 @@ internal class LLFirCombinedKotlinSymbolProvider private constructor( if (providers.size > 1) { val declarationProvider = project.mergeDeclarationProviders(providers.map { it.declarationProvider }) - // TODO (marco): Implement a package provider merger. - val combinedScope = providers.createCombinedScope() - val packageProvider = project.createPackageProvider(combinedScope) + val packageProvider = project.mergePackageProviders(providers.map { it.packageProvider }) val packageProviderForKotlinPackages = providers .filter { it.allowKotlinPackage } .takeIf { it.isNotEmpty() } - ?.let { project.createPackageProvider(it.createCombinedScope()) } + ?.map { it.packageProvider } + ?.let(project::mergePackageProviders) LLFirCombinedKotlinSymbolProvider( session, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/providerUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/providerUtils.kt index a65e8ac22c2..26e82cac7c4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/providerUtils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/providerUtils.kt @@ -5,14 +5,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.providers -import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData -import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import java.util.* internal fun Optional.getOrNull(): T? = orElse(null) - -internal fun List.createCombinedScope(): GlobalSearchScope { - if (isEmpty()) return GlobalSearchScope.EMPTY_SCOPE - return GlobalSearchScope.union(map { it.session.llFirModuleData.ktModule.contentScope }) -}