mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-285792 implement main coroutine dispatcher
- subclass `MainCoroutineDispatcher` in `EdtCoroutineDispatcher`; - register `EdtCoroutineDispatcher` as main via `MainDispatcherFactory`. GitOrigin-RevId: 18101ad18c424bb51733fe78350eb7dba2c33d54
This commit is contained in:
committed by
intellij-monorepo-bot
parent
3511a0c17e
commit
8a64253e8d
+26
-2
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
+16
@@ -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
|
||||
}
|
||||
}
|
||||
+2
@@ -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
|
||||
Reference in New Issue
Block a user