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:
peter
2016-06-22 11:27:06 +02:00
parent 158c17c584
commit 69149ec5d3
2 changed files with 14 additions and 4 deletions
@@ -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;
}
@@ -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);
}
}