[LL FIR] Use mergePackageProviders in LLFirCombinedKotlinSymbolProvider

^KT-61791
This commit is contained in:
Marco Pennekamp
2023-10-10 13:20:09 +02:00
committed by Space Team
parent b9e3d848a6
commit c289da6cf3
2 changed files with 7 additions and 13 deletions
@@ -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.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider 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.mergeDeclarationProviders
import org.jetbrains.kotlin.analysis.providers.mergePackageProviders
import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.providers.FirCompositeCachedSymbolNamesProvider import org.jetbrains.kotlin.fir.resolve.providers.FirCompositeCachedSymbolNamesProvider
@@ -129,6 +129,9 @@ internal class LLFirCombinedKotlinSymbolProvider private constructor(
} else { } else {
packageProvider.doesKotlinOnlyPackageExist(fqName) 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 } return fqName.takeIf { hasPackage }
} }
@@ -137,14 +140,13 @@ internal class LLFirCombinedKotlinSymbolProvider private constructor(
if (providers.size > 1) { if (providers.size > 1) {
val declarationProvider = project.mergeDeclarationProviders(providers.map { it.declarationProvider }) val declarationProvider = project.mergeDeclarationProviders(providers.map { it.declarationProvider })
// TODO (marco): Implement a package provider merger. val packageProvider = project.mergePackageProviders(providers.map { it.packageProvider })
val combinedScope = providers.createCombinedScope()
val packageProvider = project.createPackageProvider(combinedScope)
val packageProviderForKotlinPackages = providers val packageProviderForKotlinPackages = providers
.filter { it.allowKotlinPackage } .filter { it.allowKotlinPackage }
.takeIf { it.isNotEmpty() } .takeIf { it.isNotEmpty() }
?.let { project.createPackageProvider(it.createCombinedScope()) } ?.map { it.packageProvider }
?.let(project::mergePackageProviders)
LLFirCombinedKotlinSymbolProvider( LLFirCombinedKotlinSymbolProvider(
session, session,
@@ -5,14 +5,6 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.providers 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.* import java.util.*
internal fun <T: Any> Optional<T>.getOrNull(): T? = orElse(null) internal fun <T: Any> Optional<T>.getOrNull(): T? = orElse(null)
internal fun List<FirSymbolProvider>.createCombinedScope(): GlobalSearchScope {
if (isEmpty()) return GlobalSearchScope.EMPTY_SCOPE
return GlobalSearchScope.union(map { it.session.llFirModuleData.ktModule.contentScope })
}