From 302cbfb7c6e8e1c698f08f1bfa9ba45bb39a1433 Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Sun, 23 Feb 2025 16:47:58 +0100 Subject: [PATCH] PY-79339, IDEA-363117: Run read action safely on EDT GitOrigin-RevId: fcea125377b4d55281b2ec496a81a7c95140a034 --- .../src/GradlePluginConsoleFilterProvider.kt | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/plugins/devkit/intellij.devkit.gradle/src/GradlePluginConsoleFilterProvider.kt b/plugins/devkit/intellij.devkit.gradle/src/GradlePluginConsoleFilterProvider.kt index abd5d222d3d9..2df81a45e2d8 100644 --- a/plugins/devkit/intellij.devkit.gradle/src/GradlePluginConsoleFilterProvider.kt +++ b/plugins/devkit/intellij.devkit.gradle/src/GradlePluginConsoleFilterProvider.kt @@ -6,6 +6,7 @@ import com.intellij.execution.filters.Filter import com.intellij.openapi.application.ReadAction import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project +import com.intellij.util.application import org.jetbrains.idea.devkit.util.PsiUtil import java.util.concurrent.Callable @@ -14,13 +15,22 @@ internal class GradlePluginConsoleFilterProvider : ConsoleFilterProvider { override fun getDefaultFilters(project: Project): Array { if (DumbService.isDumb(project)) return Filter.EMPTY_ARRAY - val isPluginProject = ReadAction - .nonBlocking(Callable { PsiUtil.isPluginProject(project) }) - .expireWhen { project.isDisposed } - .executeSynchronously() + val isPluginProject = runSafeReadAction(project) { + PsiUtil.isPluginProject(project) + } if (!isPluginProject) return Filter.EMPTY_ARRAY return arrayOf(PluginVerifierFilter(project)) } -} + private fun runSafeReadAction(project: Project, action: () -> T): T { + return if (application.isDispatchThread) { + ReadAction.compute(action) + } else { + ReadAction + .nonBlocking(Callable { action() }) + .expireWhen { project.isDisposed } + .executeSynchronously() + } + } +}