diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionUpdater.kt b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionUpdater.kt index 303a7c9f4983..f2d6d695b1d0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionUpdater.kt +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionUpdater.kt @@ -18,7 +18,6 @@ import com.intellij.openapi.actionSystem.impl.ActionMenu.Companion.ALWAYS_VISIBL import com.intellij.openapi.actionSystem.impl.ActionMenu.Companion.SUPPRESS_SUBMENU import com.intellij.openapi.application.Application import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.readActionUndispatched import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.blockingContext @@ -172,8 +171,7 @@ internal class ActionUpdater @JvmOverloads constructor( } } } - if (isEDT) adjustedCall() - else readActionUndispatched(adjustedCall) + readActionUndispatchedForActionExpand(adjustedCall) } } if (PopupMenuPreloader.isToSkipComputeOnEDT(place)) { @@ -303,7 +301,7 @@ internal class ActionUpdater @JvmOverloads constructor( private suspend fun ensureSlowDataKeysPreCached(action: Any, targetOperationName: String) { if (!preCacheSlowDataKeys) return getSessionDataDeferred(Pair("precache-slow-data@$targetOperationName", null)) { - readActionUndispatched { + readActionUndispatchedForActionExpand { precacheSlowDataKeys(action, targetOperationName) } }.await() @@ -612,7 +610,7 @@ internal class ActionUpdater @JvmOverloads constructor( override fun sharedData(key: Key, supplier: Supplier): T = updater.computeSessionDataOrThrow(Pair(key.toString(), key)) { - readActionUndispatched { + readActionUndispatchedForActionExpand { supplier.get() } } diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.kt b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.kt index 8bd126be9ab6..2e257a5477ac 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.kt +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.kt @@ -25,6 +25,7 @@ import com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher import com.intellij.openapi.progress.CeProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.progress.blockingContext import com.intellij.openapi.progress.impl.ProgressManagerImpl import com.intellij.openapi.progress.prepareThreadContext import com.intellij.openapi.progress.util.PotemkinOverlayProgress @@ -889,7 +890,7 @@ suspend fun rearrangeByPromoters(actions: List, dataContext: DataConte try { service().rearrangeByPromoters(actions, frozenContext) { withContext(shortcutUpdateDispatcher) { - readActionUndispatched { + readActionUndispatchedForActionExpand { rearrangeByPromotersImpl(actions, frozenContext) } } @@ -1075,6 +1076,7 @@ private object AltEdtDispatcher : CoroutineDispatcher() { } } +// to avoid platform assertions @Suppress("NOTHING_TO_INLINE") internal inline fun runBlockingForActionExpand(context: CoroutineContext = EmptyCoroutineContext, noinline block: suspend CoroutineScope.() -> R): R = prepareThreadContext { ctx -> @@ -1086,3 +1088,8 @@ internal inline fun runBlockingForActionExpand(context: CoroutineContext = E throw CeProcessCanceledException(ce) } } + +// to avoid platform assertions +internal suspend inline fun readActionUndispatchedForActionExpand(noinline block: () -> R): R = + if (!EDT.isCurrentThreadEdt()) readActionUndispatched(block) + else blockingContext { ReadAction.compute { block() } }