[FIR] Safe dependency symbol provider in IDE session
This commit is contained in:
committed by
teamcityserver
parent
37c096cb10
commit
749dbf4d44
@@ -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
|
||||
)
|
||||
|
||||
|
||||
@@ -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<FirDependenciesSymbolProviderImpl>()
|
||||
val FirSession.dependenciesSymbolProvider: FirSymbolProvider by FirSession.sessionComponentAccessor<FirDependenciesSymbolProvider>()
|
||||
val FirSession.firProvider: FirProvider by FirSession.sessionComponentAccessor()
|
||||
val FirSession.correspondingSupertypesCache: FirCorrespondingSupertypesCache by FirSession.sessionComponentAccessor()
|
||||
val FirSession.declaredMemberScopeProvider: FirDeclaredMemberScopeProvider by FirSession.sessionComponentAccessor()
|
||||
|
||||
+2
@@ -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)
|
||||
|
||||
+2
-1
@@ -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)
|
||||
|
||||
+8
-8
@@ -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<FirSymbolProvider>,
|
||||
dependentProviders: List<FirSymbolProvider>,
|
||||
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<FirCallableSymbol<*>>, 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<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {
|
||||
getTopLevelFunctionSymbolsToWithoutDependencies(destination, packageFqName, name)
|
||||
dependentProviders.getTopLevelFunctionSymbolsTo(destination, packageFqName, name)
|
||||
dependencyProvider.getTopLevelFunctionSymbolsTo(destination, packageFqName, name)
|
||||
}
|
||||
|
||||
@FirSymbolProviderInternals
|
||||
override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, 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>) : FirSymbolProvider(session) {
|
||||
internal class DependentModuleProviders(session: FirSession, private val providers: List<FirSymbolProvider>) : FirDependenciesSymbolProvider(session) {
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? =
|
||||
providers.firstNotNullOfOrNull { provider ->
|
||||
when (provider) {
|
||||
|
||||
+35
-29
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user