diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt index 9b59ab87faf..a73a951461c 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.* import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider +import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.* @@ -175,7 +176,7 @@ object FirSessionFactory { ) register( - FirDependenciesSymbolProviderImpl::class, + FirDependenciesSymbolProvider::class, dependenciesSymbolProvider ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/MainSessionComponents.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/MainSessionComponents.kt index ea53fdbff52..6b2b94d1485 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/MainSessionComponents.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/MainSessionComponents.kt @@ -6,14 +6,14 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider -import org.jetbrains.kotlin.fir.resolve.providers.impl.FirDependenciesSymbolProviderImpl import org.jetbrains.kotlin.fir.scopes.impl.FirDeclaredMemberScopeProvider import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache val FirSession.symbolProvider: FirSymbolProvider by FirSession.sessionComponentAccessor() -val FirSession.dependenciesSymbolProvider: FirSymbolProvider by FirSession.sessionComponentAccessor() +val FirSession.dependenciesSymbolProvider: FirSymbolProvider by FirSession.sessionComponentAccessor() val FirSession.firProvider: FirProvider by FirSession.sessionComponentAccessor() val FirSession.correspondingSupertypesCache: FirCorrespondingSupertypesCache by FirSession.sessionComponentAccessor() val FirSession.declaredMemberScopeProvider: FirDeclaredMemberScopeProvider by FirSession.sessionComponentAccessor() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt index c78939fa1bc..89fe74e2a37 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt @@ -55,6 +55,8 @@ abstract class FirSymbolProvider(val session: FirSession) : FirSessionComponent abstract fun getPackage(fqName: FqName): FqName? // TODO: Replace to symbol sometime } +abstract class FirDependenciesSymbolProvider(session: FirSession) : FirSymbolProvider(session) + private fun FirSymbolProvider.getClassDeclaredMemberScope(classId: ClassId): FirScope? { val classSymbol = getClassLikeSymbolByFqName(classId) as? FirRegularClassSymbol ?: return null return session.declaredMemberScope(classSymbol.fir) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt index 73821a34c8c..6c137b96a4a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.providers.impl import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.caches.* +import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals @@ -20,7 +21,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @ThreadSafeMutableState -open class FirDependenciesSymbolProviderImpl(session: FirSession) : FirSymbolProvider(session) { +open class FirDependenciesSymbolProviderImpl(session: FirSession) : FirDependenciesSymbolProvider(session) { private val classCache = session.firCachesFactory.createCache(::computeClass) private val topLevelCallableCache = session.firCachesFactory.createCache(::computeTopLevelCallables) private val topLevelFunctionCache = session.firCachesFactory.createCache(::computeTopLevelFunctions) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirModuleWithDependenciesSymbolProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirModuleWithDependenciesSymbolProvider.kt index ce4389c56f4..ec2b3dd9a62 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirModuleWithDependenciesSymbolProvider.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirModuleWithDependenciesSymbolProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.providers import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -19,13 +20,12 @@ import org.jetbrains.kotlin.name.Name internal class FirModuleWithDependenciesSymbolProvider( session: FirSession, private val providers: List, - dependentProviders: List, + val dependencyProvider: DependentModuleProviders ) : FirSymbolProvider(session) { - private val dependentProviders = DependentModuleProviders(session, dependentProviders) override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? = getClassLikeSymbolByFqNameWithoutDependencies(classId) - ?: dependentProviders.getClassLikeSymbolByFqName(classId) + ?: dependencyProvider.getClassLikeSymbolByFqName(classId) fun getClassLikeSymbolByFqNameWithoutDependencies(classId: ClassId): FirClassLikeSymbol<*>? = @@ -34,7 +34,7 @@ internal class FirModuleWithDependenciesSymbolProvider( @FirSymbolProviderInternals override fun getTopLevelCallableSymbolsTo(destination: MutableList>, packageFqName: FqName, name: Name) { getTopLevelCallableSymbolsToWithoutDependencies(destination, packageFqName, name) - dependentProviders.getTopLevelCallableSymbolsTo(destination, packageFqName, name) + dependencyProvider.getTopLevelCallableSymbolsTo(destination, packageFqName, name) } @FirSymbolProviderInternals @@ -45,13 +45,13 @@ internal class FirModuleWithDependenciesSymbolProvider( @FirSymbolProviderInternals override fun getTopLevelFunctionSymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) { getTopLevelFunctionSymbolsToWithoutDependencies(destination, packageFqName, name) - dependentProviders.getTopLevelFunctionSymbolsTo(destination, packageFqName, name) + dependencyProvider.getTopLevelFunctionSymbolsTo(destination, packageFqName, name) } @FirSymbolProviderInternals override fun getTopLevelPropertySymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) { getTopLevelPropertySymbolsToWithoutDependencies(destination, packageFqName, name) - dependentProviders.getTopLevelPropertySymbolsTo(destination, packageFqName, name) + dependencyProvider.getTopLevelPropertySymbolsTo(destination, packageFqName, name) } @FirSymbolProviderInternals @@ -70,14 +70,14 @@ internal class FirModuleWithDependenciesSymbolProvider( override fun getPackage(fqName: FqName): FqName? = getPackageWithoutDependencies(fqName) - ?: dependentProviders.getPackage(fqName) + ?: dependencyProvider.getPackage(fqName) fun getPackageWithoutDependencies(fqName: FqName): FqName? = providers.firstNotNullOfOrNull { it.getPackage(fqName) } } -private class DependentModuleProviders(session: FirSession, private val providers: List) : FirSymbolProvider(session) { +internal class DependentModuleProviders(session: FirSession, private val providers: List) : FirDependenciesSymbolProvider(session) { override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? = providers.firstNotNullOfOrNull { provider -> when (provider) { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt index 74558211b3e..12eaa65f534 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider +import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider @@ -102,6 +103,38 @@ internal object FirIdeSessionFactory { register(FirPhaseManager::class, firPhaseManager) @OptIn(ExperimentalStdlibApi::class) + val dependentProviders = buildList { + add( + createLibrarySession( + moduleInfo, + project, + builtinsAndCloneableSession, + builtinTypes, + librariesCache, + languageVersionSettings = languageVersionSettings, + configureSession = configureSession, + ).symbolProvider + ) + dependentModules + .mapTo(this) { + createSourcesSession( + project, + configurator, + it, + builtinsAndCloneableSession, + firPhaseRunner, + sessionInvalidator, + builtinTypes, + sessionsCache, + isRootModule = false, + librariesCache, + configureSession = configureSession, + ).symbolProvider + } + } + + val dependencyProvider = DependentModuleProviders(this, dependentProviders) + register( FirSymbolProvider::class, FirModuleWithDependenciesSymbolProvider( @@ -110,38 +143,11 @@ internal object FirIdeSessionFactory { provider.symbolProvider, JavaSymbolProvider(this@session, moduleData, project, searchScope), ), - dependentProviders = buildList { - add( - createLibrarySession( - moduleInfo, - project, - builtinsAndCloneableSession, - builtinTypes, - librariesCache, - languageVersionSettings = languageVersionSettings, - configureSession = configureSession, - ).symbolProvider - ) - dependentModules - .mapTo(this) { - createSourcesSession( - project, - configurator, - it, - builtinsAndCloneableSession, - firPhaseRunner, - sessionInvalidator, - builtinTypes, - sessionsCache, - isRootModule = false, - librariesCache, - configureSession = configureSession, - ).symbolProvider - } - } + dependencyProvider ) ) + register(FirDependenciesSymbolProvider::class, dependencyProvider) register(FirJvmTypeMapper::class, FirJvmTypeMapper(this)) registerJavaSpecificResolveComponents()