[FIR] Add late initialization of session in FirModuleData

This commit is contained in:
Dmitriy Novozhilov
2021-04-30 10:28:17 +03:00
committed by TeamCityServer
parent 5cfa8694d4
commit 92d6b39ffe
4 changed files with 30 additions and 24 deletions
@@ -7,27 +7,23 @@ package org.jetbrains.kotlin.fir.session
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
class FirModuleInfoBasedModuleData( class FirModuleInfoBasedModuleData(val moduleInfo: ModuleInfo) : FirModuleData() {
val moduleInfo: ModuleInfo,
override val session: FirSession
) : FirModuleData() {
override val name: Name override val name: Name
get() = moduleInfo.name get() = moduleInfo.name
override val dependencies: List<FirModuleData> = moduleInfo.dependencies() override val dependencies: List<FirModuleData> = moduleInfo.dependencies()
.filterNot { it == moduleInfo } .filterNot { it == moduleInfo }
.map { FirModuleInfoBasedModuleData(it, session) } .map { FirModuleInfoBasedModuleData(it) }
override val dependsOnDependencies: List<FirModuleData> = moduleInfo.expectedBy override val dependsOnDependencies: List<FirModuleData> = moduleInfo.expectedBy
.filterNot { it == moduleInfo } .filterNot { it == moduleInfo }
.map { FirModuleInfoBasedModuleData(it, session) } .map { FirModuleInfoBasedModuleData(it) }
override val friendDependencies: List<FirModuleData> = moduleInfo.modulesWhoseInternalsAreVisible() override val friendDependencies: List<FirModuleData> = moduleInfo.modulesWhoseInternalsAreVisible()
.filterNot { it == moduleInfo } .filterNot { it == moduleInfo }
.map { FirModuleInfoBasedModuleData(it, session) } .map { FirModuleInfoBasedModuleData(it) }
override val platform: TargetPlatform override val platform: TargetPlatform
get() = moduleInfo.platform get() = moduleInfo.platform
@@ -78,8 +78,8 @@ object FirSessionFactory {
lookupTracker: LookupTracker? = null, lookupTracker: LookupTracker? = null,
init: FirSessionConfigurator.() -> Unit = {} init: FirSessionConfigurator.() -> Unit = {}
): FirJavaModuleBasedSession { ): FirJavaModuleBasedSession {
return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply { return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply session@{
val moduleData = FirModuleInfoBasedModuleData(moduleInfo, this) val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
registerModuleData(moduleData) registerModuleData(moduleData)
registerCliCompilerOnlyComponents() registerCliCompilerOnlyComponents()
registerCommonComponents(languageVersionSettings) registerCommonComponents(languageVersionSettings)
@@ -137,8 +137,8 @@ object FirSessionFactory {
packagePartProvider: PackagePartProvider, packagePartProvider: PackagePartProvider,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
): FirLibrarySession { ): FirLibrarySession {
return FirLibrarySession(moduleInfo, sessionProvider).apply { return FirLibrarySession(moduleInfo, sessionProvider).apply session@{
val moduleData = FirModuleInfoBasedModuleData(moduleInfo, this) val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
registerCliCompilerOnlyComponents() registerCliCompilerOnlyComponents()
registerCommonComponents(languageVersionSettings) registerCommonComponents(languageVersionSettings)
@@ -14,7 +14,17 @@ abstract class FirModuleData : FirSessionComponent {
abstract val dependsOnDependencies: List<FirModuleData> abstract val dependsOnDependencies: List<FirModuleData>
abstract val friendDependencies: List<FirModuleData> abstract val friendDependencies: List<FirModuleData>
abstract val platform: TargetPlatform abstract val platform: TargetPlatform
abstract val session: FirSession
private var _session: FirSession? = null
val session: FirSession
get() = _session!!
fun bindSession(session: FirSession) {
if (_session != null) {
error("session already bound to $this")
}
_session = session
}
} }
class FirModuleDataImpl( class FirModuleDataImpl(
@@ -22,8 +32,7 @@ class FirModuleDataImpl(
override val dependencies: List<FirModuleData>, override val dependencies: List<FirModuleData>,
override val dependsOnDependencies: List<FirModuleData>, override val dependsOnDependencies: List<FirModuleData>,
override val friendDependencies: List<FirModuleData>, override val friendDependencies: List<FirModuleData>,
override val platform: TargetPlatform, override val platform: TargetPlatform
override val session: FirSession,
) : FirModuleData() ) : FirModuleData()
val FirSession.moduleData: FirModuleData by FirSession.sessionComponentAccessor() val FirSession.moduleData: FirModuleData by FirSession.sessionComponentAccessor()
@@ -74,8 +74,8 @@ internal object FirIdeSessionFactory {
sessionsCache[moduleInfo] = session sessionsCache[moduleInfo] = session
return session.apply { return session.apply session@{
val moduleData = FirModuleInfoBasedModuleData(moduleInfo, this) val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
registerModuleData(moduleData) registerModuleData(moduleData)
val cache = ModuleFileCacheImpl(this) val cache = ModuleFileCacheImpl(this)
@@ -107,7 +107,7 @@ internal object FirIdeSessionFactory {
this, this,
providers = listOf( providers = listOf(
provider.symbolProvider, provider.symbolProvider,
JavaSymbolProvider(this@apply, moduleData, project, searchScope), JavaSymbolProvider(this@session, moduleData, project, searchScope),
), ),
dependentProviders = buildList { dependentProviders = buildList {
add( add(
@@ -171,8 +171,8 @@ internal object FirIdeSessionFactory {
val packagePartProvider = IDEPackagePartProvider(searchScope) val packagePartProvider = IDEPackagePartProvider(searchScope)
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope) val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply { FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply session@{
val moduleData = FirModuleInfoBasedModuleData(moduleInfo, this) val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
registerIdeComponents() registerIdeComponents()
register(FirPhaseManager::class, FirPhaseCheckingPhaseManager) register(FirPhaseManager::class, FirPhaseCheckingPhaseManager)
@@ -216,15 +216,16 @@ internal object FirIdeSessionFactory {
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
configureSession: (FirIdeSession.() -> Unit)? = null, configureSession: (FirIdeSession.() -> Unit)? = null,
): FirIdeBuiltinsAndCloneableSession { ): FirIdeBuiltinsAndCloneableSession {
return FirIdeBuiltinsAndCloneableSession(project, builtinTypes).apply { return FirIdeBuiltinsAndCloneableSession(project, builtinTypes).apply session@{
val moduleData = FirModuleDataImpl( val moduleData = FirModuleDataImpl(
Name.special("<builtins module>"), Name.special("<builtins module>"),
emptyList(), emptyList(),
emptyList(), emptyList(),
emptyList(), emptyList(),
JvmPlatforms.unspecifiedJvmPlatform, JvmPlatforms.unspecifiedJvmPlatform
this ).apply {
) bindSession(this@session)
}
registerIdeComponents() registerIdeComponents()
register(FirPhaseManager::class, FirPhaseCheckingPhaseManager) register(FirPhaseManager::class, FirPhaseCheckingPhaseManager)
registerCommonComponents(languageVersionSettings) registerCommonComponents(languageVersionSettings)