From 1eefca425924fea1722d39564ef852257b6b3b81 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Tue, 29 Mar 2022 18:24:17 +0300 Subject: [PATCH] [FIR] Fix dependencies duplication --- .../impl/FirDependenciesSymbolProviderImpl.kt | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) 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 db28932f185..3749ae4ef55 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 @@ -11,9 +11,7 @@ import org.jetbrains.kotlin.fir.caches.createCache import org.jetbrains.kotlin.fir.caches.firCachesFactory import org.jetbrains.kotlin.fir.caches.getValue import org.jetbrains.kotlin.fir.nullableModuleData -import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider -import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals -import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider +import org.jetbrains.kotlin.fir.resolve.providers.* import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol @@ -37,7 +35,45 @@ open class FirDependenciesSymbolProviderImpl(session: FirSession) : FirDependenc (moduleData.dependencies + moduleData.friendDependencies + moduleData.dependsOnDependencies) .mapNotNull { session.sessionProvider?.getSession(it) } .sortedBy { it.kind } - .map { it.symbolProvider } + .map { + if (it.kind == FirSession.Kind.Source) { + it.symbolProvider.loadTransitiveSourceProvides() + } else { + listOf(it.symbolProvider) + } + } + .flatten() + } + + private fun FirSymbolProvider.loadTransitiveSourceProvides(): List { + val result = mutableListOf() + val visited = hashSetOf() + + fun loadTransitiveSourceProvides(provider: FirSymbolProvider) { + if (!visited.add(provider)) { + return + } + + when { + provider is FirDependenciesSymbolProviderImpl -> { + for (p in provider.dependencyProviders) { + loadTransitiveSourceProvides(p) + } + } + provider is FirCompositeSymbolProvider -> { + for (p in provider.providers) { + loadTransitiveSourceProvides(p) + } + } + provider.session.kind == FirSession.Kind.Source -> { + result.add(provider) + } + } + } + + loadTransitiveSourceProvides(this) + + return result } @OptIn(FirSymbolProviderInternals::class, ExperimentalStdlibApi::class)