Calling Disposer.dispose() from a coroutine scope can cause exceptions, I have seen it most from releaseEditor
java.lang.RuntimeException: CE must not be thrown from a dispose() implementation
at com.intellij.openapi.util.ObjectTree.handleExceptions(ObjectTree.java:197)
at com.intellij.openapi.util.ObjectTree.runWithTrace(ObjectTree.java:142)
at com.intellij.openapi.util.ObjectTree.executeAll(ObjectTree.java:163)
at com.intellij.openapi.util.Disposer.dispose(Disposer.java:211)
at com.intellij.openapi.util.Disposer.dispose(Disposer.java:199)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:44)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:166)
at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
at com.datadog.intellij.errorTracking.toolWindow.ErrorTrackingToolWindow$1$1$1$1.invokeSuspend(ErrorTrackingToolWindow.kt:61)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:98)
at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:224)
at com.intellij.openapi.application.impl.NonBlockingFlushQueue.runNextEvent$lambda$4(NonBlockingFlushQueue.kt:358)
at com.intellij.concurrency.ThreadContext.resetThreadContext(threadContext.kt:294)
at com.intellij.openapi.application.impl.NonBlockingFlushQueue.runNextEvent(NonBlockingFlushQueue.kt:357)
at com.intellij.openapi.application.impl.NonBlockingFlushQueue.flushNow(NonBlockingFlushQueue.kt:305)
at com.intellij.openapi.application.impl.NonBlockingFlushQueue.FLUSH_NOW$lambda$0(NonBlockingFlushQueue.kt:167)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:781)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:728)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:750)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:664)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:517)
at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$0$0$0(IdeEventQueue.kt:333)
at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1065)
at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:109)
at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1065)
at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$0(IdeEventQueue.kt:331)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:371)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)
Caused by: com.intellij.openapi.progress.ProcessCanceledException: com.intellij.platform.instanceContainer.internal.ContainerDisposedException: Container 'ProjectImpl@1343411026 services' was disposed
at com.intellij.serviceContainer.ComponentManagerImpl.doGetService(ComponentManagerImpl.kt:686)
at com.intellij.serviceContainer.ComponentManagerImpl.getService(ComponentManagerImpl.kt:653)
at org.jetbrains.plugins.scala.settings.ScalaProjectSettings.getInstance(ScalaProjectSettings.java:193)
at org.jetbrains.plugins.scala.settings.ScalaProjectSettings.in(ScalaProjectSettings.java:189)
at org.jetbrains.plugins.scala.incremental.Highlighting$.enabledIn(Highlighting.scala:25)
at org.jetbrains.plugins.scala.incremental.Listener.editorReleased(Listener.scala:97)
at com.intellij.openapi.editor.impl.EditorFactoryImpl.releaseEditor$lambda$0(EditorFactoryImpl.kt:236)
at com.intellij.openapi.editor.impl.EditorFactoryImpl.releaseEditor$lambda$1(EditorFactoryImpl.kt:236)
at com.intellij.openapi.extensions.ExtensionPointName.forEachExtensionSafe(ExtensionPointName.kt:61)
at com.intellij.openapi.editor.impl.EditorFactoryImpl.releaseEditor(EditorFactoryImpl.kt:236)
at com.intellij.execution.impl.ConsoleViewImpl.disposeEditor$lambda$0$0(ConsoleViewImpl.kt:523)
at com.intellij.openapi.application.impl.AppImplKt$rethrowCheckedExceptions$2.invoke(appImpl.kt:126)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.doRunWriteIntentReadAction(NestedLocksThreadingSupport.kt:736)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.runPreventiveWriteIntentReadAction(NestedLocksThreadingSupport.kt:710)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.runWriteIntentReadAction(NestedLocksThreadingSupport.kt:664)
at com.intellij.openapi.application.impl.ApplicationImpl.runWriteIntentReadAction(ApplicationImpl.java:1185)
at com.intellij.execution.impl.ConsoleViewImpl.disposeEditor$lambda$0(ConsoleViewImpl.kt:520)
at com.intellij.util.ui.EdtInvocationManager.invokeAndWaitIfNeeded(EdtInvocationManager.java:74)
at com.intellij.util.ui.UIUtil.invokeAndWaitIfNeeded(UIUtil.java:2036)
at com.intellij.execution.impl.ConsoleViewImpl.disposeEditor(ConsoleViewImpl.kt:519)
at com.intellij.execution.impl.ConsoleViewImpl.dispose(ConsoleViewImpl.kt:463)
at com.intellij.openapi.util.ObjectTree.runWithTrace(ObjectTree.java:131)
What is the correct pattern to trigger a Dispose chain from within a coroutine scope? Do I need to do a invokeLater?