diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/AppUIExecutorImpl.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/AppUIExecutorImpl.kt index 90e4551f84a4..1f3ed3d26732 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/AppUIExecutorImpl.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/AppUIExecutorImpl.kt @@ -97,6 +97,8 @@ internal class AppUIExecutorImpl private constructor(private val modality: Modal }).expireWith(parentDisposable) } + @Deprecated("Beware, context might be infectious, if coroutine resumes other waiting coroutines. " + + "Use runUndoTransparentWriteAction instead.", ReplaceWith("this")) fun inUndoTransparentAction(): AppUIExecutorImpl { return withConstraint(object : ContextConstraint { override fun isCorrectContext(): Boolean = @@ -110,6 +112,8 @@ internal class AppUIExecutorImpl private constructor(private val modality: Modal }) } + @Deprecated("Beware, context might be infectious, if coroutine resumes other waiting coroutines. " + + "Use runWriteAction instead.", ReplaceWith("this")) fun inWriteAction(): AppUIExecutorImpl { return withConstraint(object : ContextConstraint { override fun isCorrectContext(): Boolean = @@ -128,9 +132,13 @@ internal class AppUIExecutorImpl private constructor(private val modality: Modal } } - +@Deprecated("Beware, context might be infectious, if coroutine resumes other waiting coroutines. " + + "Use runUndoTransparentWriteAction instead.", ReplaceWith("this")) fun AppUIExecutor.inUndoTransparentAction(): AppUIExecutor = (this as AppUIExecutorImpl).inUndoTransparentAction() + +@Deprecated("Beware, context might be infectious, if coroutine resumes other waiting coroutines. " + + "Use runWriteAction instead.", ReplaceWith("this")) fun AppUIExecutor.inWriteAction():AppUIExecutor = (this as AppUIExecutorImpl).inWriteAction() diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/AppUIExecutorTest.kt b/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/AppUIExecutorTest.kt index ac5583d7c364..978bb6cf9e4c 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/AppUIExecutorTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/AppUIExecutorTest.kt @@ -6,6 +6,7 @@ import com.intellij.openapi.application.AppUIExecutor import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.constraints.ConstrainedExecution +import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.editor.Document import com.intellij.openapi.fileTypes.PlainTextFileType import com.intellij.openapi.util.Disposer @@ -147,12 +148,10 @@ class AppUIExecutorTest : LightPlatformTestCase() { @ExperimentalCoroutinesApi fun `test withDocumentsCommitted`() { val executor = AppUIExecutor.onUiThread(ModalityState.NON_MODAL) - .inWriteAction() .withDocumentsCommitted(project) val transactionExecutor = AppUIExecutor.onUiThread(ModalityState.NON_MODAL) .inTransaction(project) - .inWriteAction() GlobalScope.async(SwingDispatcher) { val pdm = PsiDocumentManager.getInstance(project) @@ -161,16 +160,21 @@ class AppUIExecutorTest : LightPlatformTestCase() { commitChannel.receive() assertFalse(pdm.hasUncommitedDocuments()) - val document = createDocument() - document.insertString(0, "a") - assertTrue(pdm.hasUncommitedDocuments()) + val document = runWriteAction { + createDocument().apply { + insertString(0, "a") + assertTrue(pdm.hasUncommitedDocuments()) + } + } commitChannel.receive() assertFalse(pdm.hasUncommitedDocuments()) assertEquals("a", document.text) - document.insertString(1, "b") - assertTrue(pdm.hasUncommitedDocuments()) + runWriteAction { + document.insertString(1, "b") + assertTrue(pdm.hasUncommitedDocuments()) + } commitChannel.receive() assertFalse(pdm.hasUncommitedDocuments()) @@ -178,17 +182,17 @@ class AppUIExecutorTest : LightPlatformTestCase() { commitChannel.close() } - launch(transactionExecutor.coroutineDispatchingContext() + job) { + withContext(transactionExecutor.coroutineDispatchingContext() + job) { while (true) { - pdm.commitAllDocuments() + runWriteAction { pdm.commitAllDocuments() } if (!commitChannel.isClosedForSend) { commitChannel.send(Unit) } else { - return@launch + return@withContext } } - }.join() + } coroutineContext.cancelChildren() }.joinNonBlocking()