diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.kt b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.kt index 233dd52ffde5..a5fa0f0ada29 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.kt +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.kt @@ -21,6 +21,8 @@ import com.intellij.openapi.actionSystem.IdeActions import com.intellij.openapi.application.* import com.intellij.openapi.application.impl.ApplicationImpl import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.openapi.application.impl.LaterInvocator +import com.intellij.openapi.application.impl.inModalContext import com.intellij.openapi.client.ClientKind import com.intellij.openapi.client.currentSessionOrNull import com.intellij.openapi.components.* @@ -82,6 +84,7 @@ import com.intellij.ui.docking.impl.DockManagerImpl import com.intellij.ui.tabs.TabInfo import com.intellij.util.ExceptionUtil import com.intellij.util.IconUtil +import com.intellij.util.ObjectUtils import com.intellij.util.PlatformUtils import com.intellij.util.concurrency.ThreadingAssertions import com.intellij.util.concurrency.annotations.RequiresEdt @@ -2486,6 +2489,7 @@ fun blockingWaitForCompositeFileOpen(composite: EditorComposite) { // https://youtrack.jetbrains.com/issue/IDEA-319932 // runWithModalProgressBlocking cannot be used under a write action - https://youtrack.jetbrains.com/issue/IDEA-319932 + // IJPL-196175 & IJPL-202195: `pumpEventsForHierarchy` can't be used within `runWithModalProgressBlocking` if (ApplicationManager.getApplication().isWriteAccessAllowed) { // todo silenceWriteLock instead of executeSuspendingWriteAction (ApplicationManager.getApplication() as ApplicationImpl).executeSuspendingWriteAction( @@ -2497,23 +2501,34 @@ fun blockingWaitForCompositeFileOpen(composite: EditorComposite) { } } } + else if (LaterInvocator.isInModalContext()) { + inModalContext(ObjectUtils.sentinel("Opening file=${composite.file.name}")) { + job.waitBlockingAndPumpEdt() + } + } else { // we don't need progress - handled by async editor loader - val (parallelizedLockContext, cleanup) = getGlobalThreadingSupport().getPermitAsContextElement(currentThreadContext(), true) - try { - runBlocking(parallelizedLockContext) { - job.invokeOnCompletion { - EventQueue.invokeLater(EmptyRunnable.getInstance()) - } - IdeEventQueue.getInstance().pumpEventsForHierarchy { - job.isCompleted - } - job.join() + job.waitBlockingAndPumpEdt() + } +} + +@Suppress("RAW_RUN_BLOCKING") +@RequiresEdt +private fun Job.waitBlockingAndPumpEdt() { + val (parallelizedLockContext, cleanup) = getGlobalThreadingSupport().getPermitAsContextElement(currentThreadContext(), true) + try { + runBlocking(parallelizedLockContext) { + invokeOnCompletion { + EventQueue.invokeLater(EmptyRunnable.getInstance()) + } + + IdeEventQueue.getInstance().pumpEventsForHierarchy { + isCompleted } } - finally { - cleanup() - } + } + finally { + cleanup() } }