@Override
public RangeMarker getRangeGuard(int start, int end) {
for (RangeMarker block : myGuardedBlocks) {
- if (rangesIntersect(start, true, block.getStartOffset(), block.isGreedyToLeft(), end, true, block.getEndOffset(),
- block.isGreedyToRight())) {
+ if (rangesIntersect(start, end, true, true,
+ block.getStartOffset(), block.getEndOffset(), block.isGreedyToLeft(), block.isGreedyToRight())) {
return block;
}
}
return start <= offset && offset < end;
}
- private static boolean rangesIntersect(int start0, boolean leftInclusive0,
- int start1, boolean leftInclusive1,
- int end0, boolean rightInclusive0,
- int end1, boolean rightInclusive1) {
- if (start0 > start1 || start0 == start1 && !leftInclusive0) {
- if (end1 == start0) return leftInclusive0 && rightInclusive1;
+ private static boolean rangesIntersect(int start0, int end0, boolean start0Inclusive, boolean end0Inclusive,
+ int start1, int end1, boolean start1Inclusive, boolean end1Inclusive) {
+ if (start0 > start1 || start0 == start1 && !start0Inclusive) {
+ if (end1 == start0) return start0Inclusive && end1Inclusive;
return end1 > start0;
}
- if (end0 == start1) return leftInclusive1 && rightInclusive0;
+ if (end0 == start1) return start1Inclusive && end0Inclusive;
return end0 > start1;
}
final int newStringLength = s.length();
final CharSequence chars = myText;
int newStartInString = 0;
- int newEndInString = newStringLength;
while (newStartInString < newStringLength &&
startOffset < endOffset &&
s.charAt(newStartInString) == chars.charAt(startOffset)) {
newStartInString++;
}
+ int newEndInString = newStringLength;
while (endOffset > startOffset &&
newEndInString > newStartInString &&
s.charAt(newEndInString - 1) == chars.charAt(endOffset - 1)) {
* </ol>
* </pre>
* <p/>
- * There is a possible case that <code>'before change'</code> notification produces new change. We have a problem then - imagine
- * that initial change was <code>'replace particular range at document end'</code> and <code>'nested change'</code> was to
- * <code>'remove text at document end'</code>. That means that when initial change will be actually performed, the document may be
+ * There is a possible case that {@code 'before change'} notification produces new change. We have a problem then - imagine
+ * that initial change was {@code 'replace particular range at document end'} and {@code 'nested change'} was to
+ * {@code 'remove text at document end'}. That means that when initial change will be actually performed, the document may be
* not long enough to contain target range.
* <p/>
- * Current method allows to check if document change is a <code>'nested call'</code>.
+ * Current method allows to check if document change is a {@code 'nested call'}.
*
- * @throws IllegalStateException if this method is called during a <code>'nested document modification'</code>
+ * @throws IllegalStateException if this method is called during a {@code 'nested document modification'}
*/
private void assertNotNestedModification() throws IllegalStateException {
if (myChangeInProgress) {
try {
if (LOG.isDebugEnabled()) LOG.debug(event.toString());
+ assert event.getOldFragment().length() == event.getOldLength() : "event.getOldFragment().length() = " + event.getOldFragment().length()+"; event.getOldLength() = " + event.getOldLength();
+ assert event.getNewFragment().length() == event.getNewLength() : "event.getNewFragment().length() = " + event.getNewFragment().length()+"; event.getNewLength() = " + event.getNewLength();
+ assert prevText.length() + event.getNewLength() - event.getOldLength() == getTextLength() : "prevText.length() = " + prevText.length()+ "; event.getNewLength() = " + event.getNewLength()+ "; event.getOldLength() = " + event.getOldLength()+ "; getTextLength() = " + getTextLength();
+
myLineSet = getLineSet().update(prevText, event.getOffset(), event.getOffset() + event.getOldLength(), event.getNewFragment(), event.isWholeTextReplaced());
+ assert getTextLength() == myLineSet.getLength() : "getTextLength() = " + getTextLength()+ "; myLineSet.getLength() = " + myLineSet.getLength();
+
myFrozen = null;
if (myTabTrackingRequestors > 0) {
updateMightContainTabs(event.getNewFragment());
return createLineSet(replacement, !wholeTextReplaced);
}
- LineSet result = isSingleLineChange(prevText, start, end, replacement)
+ LineSet result = isSingleLineChange(start, end, replacement)
? updateInsideOneLine(findLineIndex(start), replacement.length() - (end - start))
: genericUpdate(prevText, start, end, replacement);
return wholeTextReplaced ? result.clearModificationFlags() : result;
}
- private boolean isSingleLineChange(@NotNull CharSequence prevText, int start, int end, @NotNull CharSequence replacement) {
+ private boolean isSingleLineChange(int start, int end, @NotNull CharSequence replacement) {
if (start == 0 && end == myLength && replacement.length() == 0) return false;
int startLine = findLineIndex(start);
doTest = testMode;
}
- private static boolean doTest = false;
+ private static boolean doTest;
+ int getLength() {
+ return myLength;
+ }
}
private final long myOldTimeStamp;
private final boolean myIsWholeDocReplaced;
private Diff.Change myChange;
- private static final Diff.Change TOO_BIG_FILE = new Diff.Change(0, 0, 0, 0, null) {
- };
+ private static final Diff.Change TOO_BIG_FILE = new Diff.Change(0, 0, 0, 0, null);
private final int myInitialStartOffset;
private final int myInitialOldLength;
myOldTimeStamp = oldTimeStamp;
myIsWholeDocReplaced = getDocument().getTextLength() != 0 && wholeTextReplaced;
+ assert initialStartOffset >= 0 : initialStartOffset;
+ assert initialOldLength >= 0 : initialOldLength;
+ assert initialStartOffset+initialOldLength <= document.getTextLength() : "initialStartOffset = " + initialStartOffset + "; initialOldLength = " + initialOldLength+";document.getTextLength() = " + document.getTextLength();
}
@Override
for (DocumentEvent event : events) {
final FrozenDocument before = frozen;
final DocumentEvent corrected;
- if ((event instanceof RetargetRangeMarkers)) {
+ if (event instanceof RetargetRangeMarkers) {
RetargetRangeMarkers retarget = (RetargetRangeMarkers)event;
corrected = new RetargetRangeMarkers(frozen, retarget.getStartOffset(), retarget.getEndOffset(), retarget.getMoveDestinationOffset());
}
else {
- frozen = frozen.applyEvent(event, 0);
corrected = new DocumentEventImpl(frozen, event.getOffset(), event.getOldFragment(), event.getNewFragment(), event.getOldTimeStamp(),
event.isWholeTextReplaced(),
((DocumentEventImpl) event).getInitialStartOffset(), ((DocumentEventImpl) event).getInitialOldLength());
+ frozen = frozen.applyEvent(event, 0);
}
int i = 0;