[Analysis API] Provide sessions in 'LLFirModuleData' for dependencies

Normally, 'bindSession()' is called on a 'FirModuleData' right after its
instantiation to make it fully initialized. For source sessions,
this is done directly during the session creation. However, module data
created for dependencies (see 'LLFirModuleData.dependencies' & friends)
stay uninitialized, breaking 'collectAllDependentSourceSessionsTo()'.
This commit is contained in:
Yan Zhulanow
2023-11-08 18:06:43 +09:00
committed by Space Team
parent c7aedd932c
commit 916e46debe
4 changed files with 23 additions and 13 deletions
@@ -72,7 +72,7 @@ class LLFirBuiltinsSessionFactory(private val project: Project) {
val builtinsModule = getBuiltinsModule(platform)
val session = LLFirBuiltinsAndCloneableSession(builtinsModule, builtInTypes)
val moduleData = LLFirModuleData(builtinsModule).apply { bindSession(session) }
val moduleData = LLFirModuleData(session)
return session.apply {
registerIdeComponents(project)
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionCache
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.FirModuleData
@@ -31,9 +33,11 @@ val FirBasedSymbol<*>.llFirModuleData: LLFirModuleData
get() = fir.llFirModuleData
class LLFirModuleData(
val ktModule: KtModule,
) : FirModuleData() {
class LLFirModuleData private constructor(val ktModule: KtModule) : FirModuleData() {
constructor(session: LLFirSession) : this(session.ktModule) {
bindSession(session)
}
override val name: Name get() = Name.special("<${ktModule.moduleDescription}>")
override val dependencies: List<FirModuleData> by lazy(LazyThreadSafetyMode.PUBLICATION) {
@@ -54,6 +58,9 @@ class LLFirModuleData(
override val analyzerServices: PlatformDependentAnalyzerServices get() = ktModule.analyzerServices
override val session: FirSession
get() = boundSession ?: LLFirSessionCache.getInstance(ktModule.project).getSession(ktModule, preferBinary = true)
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
@@ -616,7 +616,7 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
}
private fun createModuleData(session: LLFirSession): LLFirModuleData {
return LLFirModuleData(session.ktModule).apply { bindSession(session) }
return LLFirModuleData(session)
}
/**