[FIR] Add late initialization of session in FirModuleData
This commit is contained in:
committed by
TeamCityServer
parent
5cfa8694d4
commit
92d6b39ffe
+4
-8
@@ -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()
|
||||||
|
|||||||
+10
-9
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user