From 8a64253e8dc9ad3c09bb1b50b5c231a18a3c5d69 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Fri, 31 Dec 2021 14:15:36 +0100 Subject: [PATCH] IDEA-285792 implement main coroutine dispatcher - subclass `MainCoroutineDispatcher` in `EdtCoroutineDispatcher`; - register `EdtCoroutineDispatcher` as main via `MainDispatcherFactory`. GitOrigin-RevId: 18101ad18c424bb51733fe78350eb7dba2c33d54 --- .../impl/EdtCoroutineDispatcher.kt | 28 +++++++++++++++++-- .../impl/EdtCoroutineDispatcherFactory.kt | 16 +++++++++++ ....coroutines.internal.MainDispatcherFactory | 2 ++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 platform/core-impl/src/com/intellij/openapi/application/impl/EdtCoroutineDispatcherFactory.kt create mode 100644 platform/platform-impl/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory diff --git a/platform/core-impl/src/com/intellij/openapi/application/impl/EdtCoroutineDispatcher.kt b/platform/core-impl/src/com/intellij/openapi/application/impl/EdtCoroutineDispatcher.kt index 71074aeb7cf3..9f4aa457545b 100644 --- a/platform/core-impl/src/com/intellij/openapi/application/impl/EdtCoroutineDispatcher.kt +++ b/platform/core-impl/src/com/intellij/openapi/application/impl/EdtCoroutineDispatcher.kt @@ -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" + } } diff --git a/platform/core-impl/src/com/intellij/openapi/application/impl/EdtCoroutineDispatcherFactory.kt b/platform/core-impl/src/com/intellij/openapi/application/impl/EdtCoroutineDispatcherFactory.kt new file mode 100644 index 000000000000..597f325e4d4e --- /dev/null +++ b/platform/core-impl/src/com/intellij/openapi/application/impl/EdtCoroutineDispatcherFactory.kt @@ -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): MainCoroutineDispatcher { + return EdtCoroutineDispatcher + } +} diff --git a/platform/platform-impl/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory b/platform/platform-impl/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory new file mode 100644 index 000000000000..12cf6600fb2c --- /dev/null +++ b/platform/platform-impl/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory @@ -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