From a6307c596eeb6793a6bb0687e5cf85313182dce0 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Sat, 23 Mar 2024 19:05:02 +0100 Subject: [PATCH] IJPL-846 execute postOpenEditors in project coroutine scope GitOrigin-RevId: 1ba5e159b39989fb547b9a611c022f5f5c2f3d84 --- .../project/impl/ProjectFrameAllocator.kt | 65 +++++++++++-------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectFrameAllocator.kt b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectFrameAllocator.kt index c6eee1cfa6ff..29d53c9d0415 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectFrameAllocator.kt +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectFrameAllocator.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.EDT import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.asContextElement +import com.intellij.openapi.components.ComponentManagerEx import com.intellij.openapi.components.serviceAsync import com.intellij.openapi.components.serviceIfCreated import com.intellij.openapi.diagnostic.logger @@ -48,7 +49,6 @@ import com.intellij.openapi.wm.impl.* import com.intellij.platform.diagnostic.telemetry.impl.getTraceActivity import com.intellij.platform.diagnostic.telemetry.impl.rootTask import com.intellij.platform.diagnostic.telemetry.impl.span -import com.intellij.platform.ide.CoreUiCoroutineScopeHolder import com.intellij.platform.ide.bootstrap.getAndUnsetSplashProjectFrame import com.intellij.platform.ide.diagnostic.startUpPerformanceReporter.FUSProjectHotStartUpMeasurer import com.intellij.problems.WolfTheProblemSolver @@ -193,30 +193,35 @@ internal class ProjectUiFrameAllocator(@JvmField val options: OpenProjectTask, } } - val toolWindowInitJob = scheduleInitFrame(rawProjectDeferred = rawProjectDeferred, - reopeningEditorJob = reopeningEditorJob, - deferredProjectFrameHelper = deferredProjectFrameHelper) - val startUpContextElementToPass = FUSProjectHotStartUpMeasurer.getStartUpContextElementToPass() ?: EmptyCoroutineContext + val toolWindowInitJob = scheduleInitFrame( + rawProjectDeferred = rawProjectDeferred, + reopeningEditorJob = reopeningEditorJob, + deferredProjectFrameHelper = deferredProjectFrameHelper, + ) - serviceAsync().coroutineScope.launch(startUpContextElementToPass) { - try { - val project = rawProjectDeferred.await() - coroutineScope { - launch(rootTask()) { + launch { + val project = rawProjectDeferred.await() + val startUpContextElementToPass = FUSProjectHotStartUpMeasurer.getStartUpContextElementToPass() ?: EmptyCoroutineContext + @Suppress("UsagesOfObsoleteApi") + (project as ComponentManagerEx).getCoroutineScope().launch(startUpContextElementToPass + rootTask()) { + try { + launch { val frameHelper = deferredProjectFrameHelper.await() frameHelper.installDefaultProjectStatusBarWidgets(project) frameHelper.updateTitle(serviceAsync().getProjectTitle(project), project) } reopeningEditorJob.join() - postOpenEditors(deferredProjectFrameHelper = deferredProjectFrameHelper, - fileEditorManager = project.serviceAsync() as FileEditorManagerImpl, - toolWindowInitJob = toolWindowInitJob, - project = project) + postOpenEditors( + deferredProjectFrameHelper = deferredProjectFrameHelper, + fileEditorManager = project.serviceAsync() as FileEditorManagerImpl, + toolWindowInitJob = toolWindowInitJob, + project = project, + ) + } + finally { + FUSProjectHotStartUpMeasurer.reportNoMoreEditorsOnStartup(System.nanoTime()) } - } - finally { - FUSProjectHotStartUpMeasurer.reportNoMoreEditorsOnStartup(System.nanoTime()) } } @@ -333,9 +338,11 @@ internal class ProjectUiFrameAllocator(@JvmField val options: OpenProjectTask, } } -private fun CoroutineScope.scheduleInitFrame(rawProjectDeferred: CompletableDeferred, - reopeningEditorJob: Job, - deferredProjectFrameHelper: Deferred): Job { +private fun CoroutineScope.scheduleInitFrame( + rawProjectDeferred: CompletableDeferred, + reopeningEditorJob: Job, + deferredProjectFrameHelper: Deferred, +): Job { return launch { val project = rawProjectDeferred.await() span("initFrame") { @@ -344,9 +351,11 @@ private fun CoroutineScope.scheduleInitFrame(rawProjectDeferred: CompletableDefe val taskListDeferred = async(CoroutineName("toolwindow init command creation")) { computeToolWindowBeans(project = project) } - toolWindowManager.await()?.init(frameHelperDeferred = deferredProjectFrameHelper, - reopeningEditorJob = reopeningEditorJob, - taskListDeferred = taskListDeferred) + toolWindowManager.await()?.init( + frameHelperDeferred = deferredProjectFrameHelper, + reopeningEditorJob = reopeningEditorJob, + taskListDeferred = taskListDeferred, + ) } } } @@ -389,10 +398,12 @@ private suspend fun restoreEditors(project: Project, fileEditorManager: FileEdit } } -private suspend fun postOpenEditors(deferredProjectFrameHelper: Deferred, - fileEditorManager: FileEditorManagerImpl, - project: Project, - toolWindowInitJob: Job) { +private suspend fun postOpenEditors( + deferredProjectFrameHelper: Deferred, + fileEditorManager: FileEditorManagerImpl, + project: Project, + toolWindowInitJob: Job, +) { val frameHelper = deferredProjectFrameHelper.await() withContext(Dispatchers.EDT + ModalityState.any().asContextElement()) { // read the state of dockable editors