FIR IDE: synchronous creation/registration of sessions
This commit is contained in:
@@ -72,7 +72,6 @@ class FirLibrarySession private constructor(
|
|||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
sessionProvider.sessionCache[moduleInfo] = this
|
|
||||||
val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, scope)
|
val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, scope)
|
||||||
|
|
||||||
registerComponent(
|
registerComponent(
|
||||||
@@ -98,6 +97,8 @@ class FirLibrarySession private constructor(
|
|||||||
FirCorrespondingSupertypesCache::class,
|
FirCorrespondingSupertypesCache::class,
|
||||||
FirCorrespondingSupertypesCache(this)
|
FirCorrespondingSupertypesCache(this)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sessionProvider.sessionCache[moduleInfo] = this
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ class FirIdeJavaModuleBasedSession(
|
|||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
sessionProvider.sessionCache[moduleInfo] = this
|
|
||||||
registerComponent(
|
registerComponent(
|
||||||
FirProvider::class,
|
FirProvider::class,
|
||||||
IdeFirProvider(project, scope, RawFirBuilder(this, stubMode = false), this)
|
IdeFirProvider(project, scope, RawFirBuilder(this, stubMode = false), this)
|
||||||
|
|||||||
@@ -25,22 +25,35 @@ private fun createLibrarySession(moduleInfo: IdeaModuleInfo, project: Project, p
|
|||||||
return FirLibrarySession.create(moduleInfo, provider, contentScope, project, IDEPackagePartProvider(contentScope))
|
return FirLibrarySession.create(moduleInfo, provider, contentScope, project, IDEPackagePartProvider(contentScope))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getOrCreateIdeSession(
|
||||||
|
sessionProvider: FirProjectSessionProvider,
|
||||||
|
project: Project,
|
||||||
|
moduleInfo: ModuleSourceInfo
|
||||||
|
): FirSession {
|
||||||
|
sessionProvider.getSession(moduleInfo)?.let { return it }
|
||||||
|
return synchronized(moduleInfo.module) {
|
||||||
|
sessionProvider.getSession(moduleInfo) ?: FirIdeJavaModuleBasedSession(
|
||||||
|
project, moduleInfo, sessionProvider, moduleInfo.contentScope()
|
||||||
|
).also { moduleBasedSession ->
|
||||||
|
val ideaModuleInfo = moduleInfo.cast<IdeaModuleInfo>()
|
||||||
|
ideaModuleInfo.dependenciesWithoutSelf().forEach {
|
||||||
|
if (it is IdeaModuleInfo && it.isLibraryClasses()) {
|
||||||
|
// TODO: consider caching / synchronization here
|
||||||
|
createLibrarySession(it, project, sessionProvider)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sessionProvider.sessionCache[moduleInfo] = moduleBasedSession
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface FirResolveState {
|
interface FirResolveState {
|
||||||
val sessionProvider: FirSessionProvider
|
val sessionProvider: FirSessionProvider
|
||||||
|
|
||||||
fun getSession(psi: KtElement): FirSession {
|
fun getSession(psi: KtElement): FirSession {
|
||||||
val sessionProvider = sessionProvider as FirProjectSessionProvider
|
val sessionProvider = sessionProvider as FirProjectSessionProvider
|
||||||
val moduleInfo = psi.getModuleInfo() as ModuleSourceInfo
|
val moduleInfo = psi.getModuleInfo() as ModuleSourceInfo
|
||||||
return sessionProvider.getSession(moduleInfo) ?: FirIdeJavaModuleBasedSession(
|
return getOrCreateIdeSession(sessionProvider, psi.project, moduleInfo)
|
||||||
psi.project, moduleInfo, sessionProvider, moduleInfo.contentScope()
|
|
||||||
).also {
|
|
||||||
val ideaModuleInfo = moduleInfo.cast<IdeaModuleInfo>()
|
|
||||||
ideaModuleInfo.dependenciesWithoutSelf().forEach {
|
|
||||||
if (it is IdeaModuleInfo && it.isLibraryClasses()) {
|
|
||||||
createLibrarySession(it, psi.project, sessionProvider)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun get(psi: KtElement): FirElement?
|
operator fun get(psi: KtElement): FirElement?
|
||||||
|
|||||||
Reference in New Issue
Block a user