From 69149ec5d370d8509bd0deab65d4f5d52a4fd791 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 22 Jun 2016 11:23:59 +0200 Subject: [PATCH] assert model changes happen in EDT, clarify transaction assertions and add one that bg progress should have a write-safe modality --- .../openapi/application/TransactionGuardImpl.java | 7 +++++-- .../util/AbstractProgressIndicatorExBase.java | 11 +++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java b/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java index b0bd3cf351db..eaba0f6fabb4 100644 --- a/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java @@ -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; } diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorExBase.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorExBase.java index 24d38fb66402..b165a6393e9f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorExBase.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorExBase.java @@ -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); } }