From 8b3ee81536a3c605ec0fb6913ddcabd615ccb17c Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Thu, 8 Aug 2024 14:19:44 +0200 Subject: [PATCH] [kotlin] Deprecate org.jetbrains.kotlin.idea.core.util.EDT #KTIJ-30910 GitOrigin-RevId: 177f438ea07fd6cf1d06c22dc2309a885d6cb4ab --- .../idea/core/KotlinPluginDisposable.kt | 3 ++- .../kotlin/idea/core/util/CoroutineUtils.kt | 1 + .../GradleLegacyScriptConfigurationLoader.kt | 13 ++++++----- .../roots/GradleBuildRootsManager.kt | 9 ++++---- .../AbstractCompletionBenchmarkAction.kt | 5 +++-- .../benchmark/HighlightingBenchmarkAction.kt | 7 +++--- .../kotlin/j2k/OldJ2kPostProcessor.kt | 22 +++++++++---------- 7 files changed, 33 insertions(+), 27 deletions(-) diff --git a/plugins/kotlin/base/plugin/src/org/jetbrains/kotlin/idea/core/KotlinPluginDisposable.kt b/plugins/kotlin/base/plugin/src/org/jetbrains/kotlin/idea/core/KotlinPluginDisposable.kt index 0e0803abbda1..de8ddee6cb52 100644 --- a/plugins/kotlin/base/plugin/src/org/jetbrains/kotlin/idea/core/KotlinPluginDisposable.kt +++ b/plugins/kotlin/base/plugin/src/org/jetbrains/kotlin/idea/core/KotlinPluginDisposable.kt @@ -9,10 +9,11 @@ import com.intellij.openapi.application.ReadAction import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import kotlinx.coroutines.CoroutineScope import org.jetbrains.annotations.ApiStatus @Service(Service.Level.PROJECT) -class KotlinPluginDisposable : Disposable { +class KotlinPluginDisposable(val coroutineScope: CoroutineScope) : Disposable { @Volatile var disposed: Boolean = false diff --git a/plugins/kotlin/base/util/src/org/jetbrains/kotlin/idea/core/util/CoroutineUtils.kt b/plugins/kotlin/base/util/src/org/jetbrains/kotlin/idea/core/util/CoroutineUtils.kt index 5f1818603fc1..2fa35a0c8979 100644 --- a/plugins/kotlin/base/util/src/org/jetbrains/kotlin/idea/core/util/CoroutineUtils.kt +++ b/plugins/kotlin/base/util/src/org/jetbrains/kotlin/idea/core/util/CoroutineUtils.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.idea.util.application.isDispatchThread import kotlin.coroutines.AbstractCoroutineContextElement import kotlin.coroutines.CoroutineContext +@Deprecated("Use Dispatchers.EDT instead", replaceWith = ReplaceWith("Dispatchers.EDT")) object EDT : CoroutineDispatcher() { override fun isDispatchNeeded(context: CoroutineContext): Boolean = !isDispatchThread() diff --git a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/legacy/GradleLegacyScriptConfigurationLoader.kt b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/legacy/GradleLegacyScriptConfigurationLoader.kt index 529d15d86b81..383e36648fcf 100644 --- a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/legacy/GradleLegacyScriptConfigurationLoader.kt +++ b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/legacy/GradleLegacyScriptConfigurationLoader.kt @@ -2,16 +2,17 @@ package org.jetbrains.kotlin.idea.gradleJava.scripting.legacy -import com.intellij.openapi.application.runWriteAction +import com.intellij.openapi.application.EDT +import com.intellij.openapi.application.writeAction import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs import org.jetbrains.kotlin.idea.core.script.configuration.loader.DefaultScriptConfigurationLoader import org.jetbrains.kotlin.idea.core.script.configuration.loader.ScriptConfigurationLoadingContext -import org.jetbrains.kotlin.idea.core.util.EDT import org.jetbrains.kotlin.idea.gradleJava.scripting.getGradleScriptInputsStamp import org.jetbrains.kotlin.idea.gradleJava.scripting.isGradleKotlinScript import org.jetbrains.kotlin.idea.gradleJava.scripting.roots.GradleBuildRootsManager @@ -23,7 +24,7 @@ import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition * * TODO(gradle6): remove */ -class GradleLegacyScriptConfigurationLoader(project: Project) : DefaultScriptConfigurationLoader(project) { +class GradleLegacyScriptConfigurationLoader(project: Project, private val coroutineScope: CoroutineScope) : DefaultScriptConfigurationLoader(project) { private val buildRootsManager get() = GradleBuildRootsManager.getInstanceSafe(project) @@ -64,8 +65,8 @@ class GradleLegacyScriptConfigurationLoader(project: Project) : DefaultScriptCon } // Gradle read files from FS, so let's save all docs - GlobalScope.launch(EDT(project)) { - runWriteAction { + coroutineScope.launch(Dispatchers.EDT) { + writeAction { FileDocumentManager.getInstance().saveAllDocuments() } } diff --git a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootsManager.kt b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootsManager.kt index 88ce0242316e..a7aa33d2c287 100644 --- a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootsManager.kt +++ b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootsManager.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.idea.gradleJava.scripting.roots import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer +import com.intellij.openapi.application.EDT import com.intellij.openapi.application.runReadAction import com.intellij.openapi.diagnostic.ControlFlowException import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil @@ -14,7 +15,8 @@ import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiManager import com.intellij.ui.EditorNotifications -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginModeProvider import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener @@ -27,7 +29,6 @@ import org.jetbrains.kotlin.idea.core.script.scriptingDebugLog import org.jetbrains.kotlin.idea.core.script.scriptingErrorLog import org.jetbrains.kotlin.idea.core.script.scriptingInfoLog import org.jetbrains.kotlin.idea.core.script.ucache.ScriptClassRootsBuilder -import org.jetbrains.kotlin.idea.core.util.EDT import org.jetbrains.kotlin.idea.gradle.scripting.LastModifiedFiles import org.jetbrains.kotlin.idea.gradleJava.scripting.getGradleVersion import org.jetbrains.kotlin.idea.gradleJava.scripting.importing.KotlinDslGradleBuildSync @@ -66,7 +67,7 @@ import java.util.concurrent.atomic.AtomicBoolean * - [New] - not yet imported * - [Imported] - imported */ -class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(project), ScriptingSupport { +class GradleBuildRootsManager(val project: Project, private val coroutineScope: CoroutineScope) : GradleBuildRootsLocator(project), ScriptingSupport { private val manager: CompositeScriptConfigurationManager get() = ScriptConfigurationManager.getInstance(project) as CompositeScriptConfigurationManager @@ -393,7 +394,7 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(pr if (openedScripts.isEmpty()) return - GlobalScope.launch(EDT(project)) { + coroutineScope.launch(Dispatchers.EDT) { if (project.isDisposed) return@launch openedScripts.forEach { diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/actions/internal/benchmark/AbstractCompletionBenchmarkAction.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/actions/internal/benchmark/AbstractCompletionBenchmarkAction.kt index 2335b0668667..d55b58daae0f 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/actions/internal/benchmark/AbstractCompletionBenchmarkAction.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/actions/internal/benchmark/AbstractCompletionBenchmarkAction.kt @@ -8,6 +8,7 @@ import com.intellij.codeInsight.navigation.openFileWithPsiElement import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.application.EDT import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.command.CommandProcessor import com.intellij.openapi.editor.EditorFactory @@ -30,8 +31,8 @@ import org.jetbrains.kotlin.idea.base.projectStructure.moduleInfoOrNull import org.jetbrains.kotlin.idea.base.psi.getLineCount import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.completion.CompletionBenchmarkSink +import org.jetbrains.kotlin.idea.core.KotlinPluginDisposable import org.jetbrains.kotlin.idea.core.moveCaret -import org.jetbrains.kotlin.idea.core.util.EDT import org.jetbrains.kotlin.idea.core.util.toPsiFile import org.jetbrains.kotlin.idea.util.application.isApplicationInternalMode import org.jetbrains.kotlin.psi.KtFile @@ -46,7 +47,7 @@ abstract class AbstractCompletionBenchmarkAction : AnAction() { val benchmarkSink = CompletionBenchmarkSink.enableAndGet() val scenario = createBenchmarkScenario(project, benchmarkSink) ?: return - GlobalScope.launch(EDT) { + KotlinPluginDisposable.getInstance(project).coroutineScope.launch(Dispatchers.EDT) { scenario.doBenchmark() CompletionBenchmarkSink.disable() } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/actions/internal/benchmark/HighlightingBenchmarkAction.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/actions/internal/benchmark/HighlightingBenchmarkAction.kt index 224d66c1c851..ea1c52383e8d 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/actions/internal/benchmark/HighlightingBenchmarkAction.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/actions/internal/benchmark/HighlightingBenchmarkAction.kt @@ -11,6 +11,7 @@ import com.intellij.openapi.actionSystem.ActionManager import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.application.EDT import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.impl.DocumentMarkupModel import com.intellij.openapi.project.Project @@ -19,7 +20,7 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.ui.components.JBPanel import com.intellij.ui.components.JBTextField import com.intellij.uiDesigner.core.GridLayoutManager -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.onClosed import kotlinx.coroutines.delay @@ -29,7 +30,7 @@ import org.jetbrains.kotlin.idea.actions.internal.benchmark.AbstractCompletionBe import org.jetbrains.kotlin.idea.actions.internal.benchmark.AbstractCompletionBenchmarkAction.Companion.shuffledSequence import org.jetbrains.kotlin.idea.base.psi.getLineCount import org.jetbrains.kotlin.idea.base.resources.KotlinBundle -import org.jetbrains.kotlin.idea.core.util.EDT +import org.jetbrains.kotlin.idea.core.KotlinPluginDisposable import org.jetbrains.kotlin.idea.util.application.isApplicationInternalMode import org.jetbrains.kotlin.psi.KtFile import java.util.* @@ -70,7 +71,7 @@ class HighlightingBenchmarkAction : AnAction() { val finishListener = DaemonFinishListener() connection.subscribe(DaemonCodeAnalyzer.DAEMON_EVENT_TOPIC, finishListener) - GlobalScope.launch(EDT) { + KotlinPluginDisposable.getInstance(project).coroutineScope.launch(Dispatchers.EDT) { try { delay(100) ktFiles diff --git a/plugins/kotlin/j2k/k1.old/src/org/jetbrains/kotlin/j2k/OldJ2kPostProcessor.kt b/plugins/kotlin/j2k/k1.old/src/org/jetbrains/kotlin/j2k/OldJ2kPostProcessor.kt index 7bf6e469d9c0..1b7ceb3a425b 100644 --- a/plugins/kotlin/j2k/k1.old/src/org/jetbrains/kotlin/j2k/OldJ2kPostProcessor.kt +++ b/plugins/kotlin/j2k/k1.old/src/org/jetbrains/kotlin/j2k/OldJ2kPostProcessor.kt @@ -3,9 +3,10 @@ package org.jetbrains.kotlin.j2k import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.ModalityState -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.EDT +import com.intellij.openapi.application.readAction import com.intellij.openapi.application.runWriteAction +import com.intellij.openapi.application.writeAction import com.intellij.openapi.diagnostic.ControlFlowException import com.intellij.openapi.editor.RangeMarker import com.intellij.openapi.editor.asTextRange @@ -14,12 +15,11 @@ import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import com.intellij.psi.PsiRecursiveElementVisitor import com.intellij.psi.codeStyle.CodeStyleManager -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.core.KotlinPluginDisposable -import org.jetbrains.kotlin.idea.core.util.EDT import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.j2k.PostProcessingTarget.MultipleFilesPostProcessingTarget import org.jetbrains.kotlin.j2k.PostProcessingTarget.PieceOfCodePostProcessingTarget @@ -59,14 +59,14 @@ class OldJ2kPostProcessor(private val formatCode: Boolean = true) : PostProcesso val disposable = KotlinPluginDisposable.getInstance(file.project) - runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) { + disposable.coroutineScope.launch(Dispatchers.EDT) { do { var modificationStamp: Long? = file.modificationStamp val elementToActions: List = run { @Suppress("DEPRECATION") while (!Disposer.isDisposed(disposable)) { try { - return@run runReadAction { + return@run readAction { collectAvailableActions(file, rangeMarker) } } catch (e: Exception) { @@ -77,11 +77,11 @@ class OldJ2kPostProcessor(private val formatCode: Boolean = true) : PostProcesso emptyList() } - withContext(EDT) { + launch(Dispatchers.EDT) { for ((element, action, _, writeActionNeeded) in elementToActions) { if (element.isValid) { if (writeActionNeeded) { - runWriteAction { + writeAction { action() } } else { @@ -98,8 +98,8 @@ class OldJ2kPostProcessor(private val formatCode: Boolean = true) : PostProcesso if (formatCode) { - withContext(EDT) { - runWriteAction { + launch(Dispatchers.EDT) { + writeAction { val codeStyleManager = CodeStyleManager.getInstance(file.project) if (rangeMarker != null) { if (rangeMarker.isValid) {