From 996cefbf94cb962dea4b06b6655e7d2a12ec0d6e Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 30 Mar 2012 12:55:00 +0400 Subject: [PATCH] persistent rangemarker update for small documents --- .../openapi/editor/impl/PersistentRangeMarker.java | 13 +++++++++---- .../intellij/openapi/editor/RangeMarkerTest.java | 11 +++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java index e1b34cc49ad7..59c124698166 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java @@ -69,19 +69,24 @@ class PersistentRangeMarker extends RangeMarkerImpl { private boolean translateViaDiff(final DocumentEventImpl event) { try { myStartLine = event.translateLineViaDiffStrict(myStartLine); - if (myStartLine < 0 || myStartLine >= getDocument().getLineCount()) { + DocumentEx document = getDocument(); + if (myStartLine < 0 || myStartLine >= document.getLineCount()) { invalidate(event); } else { - setIntervalStart(getDocument().getLineStartOffset(myStartLine) + myStartColumn); + int start = document.getLineStartOffset(myStartLine) + myStartColumn; + if (start >= document.getTextLength()) return false; + setIntervalStart(start); } myEndLine = event.translateLineViaDiffStrict(myEndLine); - if (myEndLine < 0 || myEndLine >= getDocument().getLineCount()) { + if (myEndLine < 0 || myEndLine >= document.getLineCount()) { invalidate(event); } else { - setIntervalEnd(getDocument().getLineStartOffset(myEndLine) + myEndColumn); + int end = document.getLineStartOffset(myEndLine) + myEndColumn; + if (end > document.getTextLength()) return false; + setIntervalEnd(end); } return true; } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/RangeMarkerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/RangeMarkerTest.java index 9e556a22f4fd..b919fd29fc67 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/RangeMarkerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/RangeMarkerTest.java @@ -1045,4 +1045,15 @@ public class RangeMarkerTest extends LightPlatformTestCase { EditorFactory.getInstance().releaseEditor(editor); } } + public void testPersistent() throws Exception { + String text = "xxx\nzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"; + Document document = EditorFactory.getInstance().createDocument(text); + int startOffset = text.indexOf('z'); + int endOffset = text.lastIndexOf('z'); + RangeMarker marker = document.createRangeMarker(startOffset, endOffset, true); + + document.replaceString(startOffset+1, endOffset-1, "ccc"); + + assertTrue(marker.isValid()); + } }