diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java
index 874685d1ac0a..49fae09f8d03 100644
--- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java
@@ -825,7 +825,6 @@ public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
void afterDocumentChange(@NotNull final DocumentEventImpl event) {
final DocumentEx document = myEditor.getDocument();
- if (document.isInBulkUpdate()) return;
boolean performSoftWrapAdjustment = event.getNewLength() > 0 // We want to put caret just after the last added symbol
// There is a possible case that the user removes text just before the soft wrap. We want to keep caret
// on a visual line with soft wrap start then.
diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java
index 38e79c6f6b6c..ffb1e98d7fe7 100644
--- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java
@@ -81,11 +81,13 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
isDocumentChanged = true;
try {
myIsInUpdate = false;
- doWithCaretMerging(() -> {
- for (CaretImpl caret : myCarets) {
- caret.afterDocumentChange((DocumentEventImpl)e);
- }
- });
+ if (!myEditor.getDocument().isInBulkUpdate()) {
+ doWithCaretMerging(() -> {
+ for (CaretImpl caret : myCarets) {
+ caret.afterDocumentChange((DocumentEventImpl)e);
+ }
+ });
+ }
}
finally {
isDocumentChanged = false;
diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java
index 0a0191ed796f..ea857bb068a3 100644
--- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java
+++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java
@@ -137,6 +137,29 @@ public class EditorImplTest extends AbstractEditorTest {
checkResultByText("something\telse");
}
+ public void testCaretMergeDuringBulkModeDocumentUpdate() throws Exception {
+ initText("abcdefg\n" +
+ "abcdefg");
+ new WriteCommandAction.Simple(getProject()) {
+ @Override
+ protected void run() throws Throwable {
+ DocumentEx document = (DocumentEx)myEditor.getDocument();
+ document.setInBulkUpdate(true);
+ try {
+ // delete selected text
+ document.deleteString(1, 6);
+ document.deleteString(4, 9);
+ }
+ finally {
+ document.setInBulkUpdate(false);
+ }
+ }
+ }.execute().throwException();
+
+ checkResultByText("ag\n" +
+ "ag");
+ }
+
public void testPositionCalculationForOneCharacterFolds() throws Exception {
initText("something");
addCollapsedFoldRegion(1, 2, "...");