[java] use proper modality state in coroutine dispatcher in 'compilerDriverHelper::saveSettings' (IDEA-324032)

Otherwise, if compilation is invoked from a modal dialog, when the coroutine switches to EDT (via saveSettings -> reloadChangedStorageFiles -> doReload), it'll use NON_MODAL state and therefore code won't be executed.

GitOrigin-RevId: 64a0023763c9599618f544cfb897bbeff8033944
This commit is contained in:
Nikolay Chashnikov
2023-06-30 11:08:52 +02:00
committed by intellij-monorepo-bot
parent 24e45b2fb3
commit 86d86261f0
2 changed files with 9 additions and 3 deletions

View File

@@ -12,6 +12,7 @@ import com.intellij.ide.nls.NlsMessages;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationListener;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.compiler.*;
@@ -386,6 +387,7 @@ public final class CompileDriver {
final CompileStatusNotification callback,
final CompilerMessage message) {
ApplicationManager.getApplication().assertIsDispatchThread();
ModalityState modalityState = ModalityState.current();
final boolean isUnitTestMode = ApplicationManager.getApplication().isUnitTestMode();
final String name = JavaCompilerBundle.message(
@@ -413,7 +415,7 @@ public final class CompileDriver {
}
// ensure the project model seen by build process is up-to-date
CompilerDriverHelperKt.saveSettings(myProject, isUnitTestMode);
CompilerDriverHelperKt.saveSettings(myProject, modalityState, isUnitTestMode);
Tracer.Span compileWorkSpan = Tracer.start("compileWork");
CompilerCacheManager compilerCacheManager = CompilerCacheManager.getInstance(myProject);
final BuildManager buildManager = BuildManager.getInstance();

View File

@@ -3,6 +3,8 @@ package com.intellij.compiler.impl
import com.intellij.configurationStore.saveSettings
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.application.asContextElement
import com.intellij.openapi.project.Project
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
import kotlinx.coroutines.Dispatchers
@@ -10,8 +12,10 @@ import kotlinx.coroutines.runBlocking
@Suppress("RAW_RUN_BLOCKING")
@RequiresBackgroundThread
internal fun saveSettings(project: Project, isUnitTestMode: Boolean) {
runBlocking(Dispatchers.Default) {
internal fun saveSettings(project: Project,
modalityState: ModalityState,
isUnitTestMode: Boolean) {
runBlocking(Dispatchers.Default + modalityState.asContextElement()) {
saveSettings(project)
if (!isUnitTestMode) {
saveSettings(ApplicationManager.getApplication())