[FIR] Safe dependency symbol provider in IDE session

This commit is contained in:
Dmitriy Novozhilov
2021-06-28 17:33:26 +03:00
committed by teamcityserver
parent 37c096cb10
commit 749dbf4d44
6 changed files with 51 additions and 41 deletions
@@ -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) {
@@ -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()