mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
assert model changes happen in EDT, clarify transaction assertions and add one that bg progress should have a write-safe modality
This commit is contained in:
@@ -224,13 +224,16 @@ public class TransactionGuardImpl extends TransactionGuard {
|
||||
};
|
||||
}
|
||||
|
||||
private boolean isWriteSafeModality(ModalityState state) {
|
||||
public boolean isWriteSafeModality(ModalityState state) {
|
||||
return Boolean.TRUE.equals(myWriteSafeModalities.get(state));
|
||||
}
|
||||
|
||||
public void assertWriteActionAllowed() {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
if (Registry.is("ide.require.transaction.for.model.changes", false) && !myWritingAllowed) {
|
||||
String message = "Write access is allowed from model transactions only, see TransactionGuard documentation for details";
|
||||
String message = "Write access is allowed from write-safe contexts only. " +
|
||||
"Please ensure you're using invokeLater/invokeAndWait with a correct modality state (not \"any\"). " +
|
||||
"See TransactionGuard documentation for details";
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
message += "; current modality=" + ModalityState.current() + "; known modalities=" + myWriteSafeModalities;
|
||||
}
|
||||
|
||||
+9
-2
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
package com.intellij.openapi.progress.util;
|
||||
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.application.*;
|
||||
import com.intellij.openapi.application.impl.LaterInvocator;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.progress.ProgressIndicator;
|
||||
@@ -106,7 +106,14 @@ public class AbstractProgressIndicatorExBase extends AbstractProgressIndicatorBa
|
||||
|
||||
protected final void enterModality() {
|
||||
if (myModalityProgress == this) {
|
||||
GuiUtils.invokeLaterIfNeeded(this::doEnterModality, ModalityState.defaultModalityState());
|
||||
ModalityState modalityState = ModalityState.defaultModalityState();
|
||||
if (!myModalityEntered &&
|
||||
!ApplicationManager.getApplication().isDispatchThread() &&
|
||||
!((TransactionGuardImpl)TransactionGuard.getInstance()).isWriteSafeModality(modalityState)) {
|
||||
// exceptions here should be assigned to Peter
|
||||
LOG.error("Non-modal progress should be started in a write-safe context: an action or modality-aware invokeLater. See also TransactionGuard documentation.");
|
||||
}
|
||||
GuiUtils.invokeLaterIfNeeded(this::doEnterModality, modalityState);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user