correctly handle highlighters update inside batch folding operation (EA-85008, IDEA-157464)

This commit is contained in:
Dmitry Batrak
2016-06-30 19:50:17 +03:00
parent 2b0d85f396
commit 8931e8b647
2 changed files with 20 additions and 0 deletions
@@ -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);
}
@@ -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());
}
}