diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java index e62031c00d39..e8af7067873a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java @@ -296,6 +296,11 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold myDocumentChangeStartOffset = Math.min(myDocumentChangeStartOffset, startOffset); myDocumentChangeEndOffset = Math.max(myDocumentChangeEndOffset, endOffset); } + else if (myFoldingChangeEndOffset != Integer.MIN_VALUE) { + // during batch folding processing we delay invalidation requests, as we cannot perform coordinate conversions immediately + myFoldingChangeStartOffset = Math.min(myFoldingChangeStartOffset, startOffset); + myFoldingChangeEndOffset = Math.max(myFoldingChangeEndOffset, endOffset); + } else { doInvalidateRange(startOffset, endOffset); } 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 59d5b89fa0bc..fdb4f286dc68 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 @@ -29,6 +29,7 @@ import com.intellij.openapi.editor.event.SelectionListener; import com.intellij.openapi.editor.ex.DocumentBulkUpdateListener; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.editor.ex.EditorEx; +import com.intellij.openapi.editor.ex.FoldingModelEx; import com.intellij.openapi.editor.ex.util.EditorUtil; import com.intellij.openapi.editor.markup.HighlighterTargetArea; import com.intellij.openapi.editor.markup.RangeHighlighter; @@ -390,4 +391,18 @@ public class EditorImplTest extends AbstractEditorTest { assertEquals(7, highlighters[0].getStartOffset()); assertEquals(8, highlighters[0].getEndOffset()); } + + public void testChangingHighlightersAfterClearingFoldingsDuringFoldingBatchUpdate() throws Exception { + initText("abc\n\ndef"); + addCollapsedFoldRegion(2, 6, "..."); + myEditor.getFoldingModel().runBatchFoldingOperation(() -> { + ((FoldingModelEx)myEditor.getFoldingModel()).clearFoldRegions(); + myEditor.getMarkupModel().addRangeHighlighter(7, 8, 0, new TextAttributes(null, null, null, null, Font.BOLD), + HighlighterTargetArea.EXACT_RANGE); + }); + RangeHighlighter[] highlighters = myEditor.getMarkupModel().getAllHighlighters(); + assertEquals(1, highlighters.length); + assertEquals(7, highlighters[0].getStartOffset()); + assertEquals(8, highlighters[0].getEndOffset()); + } }