IDEA-285792 implement main coroutine dispatcher

- subclass `MainCoroutineDispatcher` in `EdtCoroutineDispatcher`;
- register `EdtCoroutineDispatcher` as main via `MainDispatcherFactory`.

GitOrigin-RevId: 18101ad18c424bb51733fe78350eb7dba2c33d54
This commit is contained in:
Daniil Ovchinnikov
2021-12-31 15:11:53 +00:00
committed by intellij-monorepo-bot
parent 3511a0c17e
commit 8a64253e8d
3 changed files with 44 additions and 2 deletions
@@ -3,11 +3,15 @@ package com.intellij.openapi.application.impl
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ModalityState
import kotlinx.coroutines.CoroutineDispatcher
import com.intellij.util.ui.EDT
import kotlinx.coroutines.MainCoroutineDispatcher
import kotlinx.coroutines.Runnable
import kotlinx.coroutines.job
import kotlin.coroutines.CoroutineContext
internal object EdtCoroutineDispatcher : CoroutineDispatcher() {
internal sealed class EdtCoroutineDispatcher : MainCoroutineDispatcher() {
override val immediate: MainCoroutineDispatcher get() = Immediate
override fun dispatch(context: CoroutineContext, block: Runnable) {
val state = context[ModalityStateElement]?.modalityState
@@ -20,4 +24,24 @@ internal object EdtCoroutineDispatcher : CoroutineDispatcher() {
}
ApplicationManager.getApplication().invokeLater(runnable, state)
}
companion object : EdtCoroutineDispatcher() {
override fun toString() = "EDT"
}
object Immediate : EdtCoroutineDispatcher() {
override fun isDispatchNeeded(context: CoroutineContext): Boolean {
if (!EDT.isCurrentThreadEdt()) {
return true
}
// The current coroutine is executed with the correct modality state
// (the execution would be postponed otherwise)
// => there is no need to check modality state here.
return false
}
override fun toString() = "EDT.immediate"
}
}
@@ -0,0 +1,16 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.application.impl
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.coroutines.MainCoroutineDispatcher
import kotlinx.coroutines.internal.MainDispatcherFactory
@InternalCoroutinesApi
internal class EdtCoroutineDispatcherFactory : MainDispatcherFactory {
override val loadPriority: Int get() = 0
override fun createDispatcher(allFactories: List<MainDispatcherFactory>): MainCoroutineDispatcher {
return EdtCoroutineDispatcher
}
}
@@ -0,0 +1,2 @@
# Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
com.intellij.openapi.application.impl.EdtCoroutineDispatcherFactory