diff: fix myLastChangedLine modification by changed range

lastChangedLine - inclusive, while offset2 - exclusive

We don't need to merge ranges anymore, as there are no mergeable ranges (previously, there was possible merge between newChangedRanges.last range and rangesAfterChange.first)
Those merges could lead to range modification with equal lines at the start or end.
This commit is contained in:
Aleksey Pivovarov
2014-06-23 21:06:10 +04:00
parent 1cddf396c1
commit 8a8ab670b6
@@ -45,7 +45,6 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
@@ -344,7 +343,7 @@ public class LineStatusTracker {
myFirstChangedLine = firstChangedRange.getOffset1();
}
if (lastChangedRange != null && lastChangedRange.getOffset2() > myLastChangedLine) {
myLastChangedLine = lastChangedRange.getOffset2();
myLastChangedLine = lastChangedRange.getOffset2() - 1;
}
int currentFirstLine = myFirstChangedLine;
@@ -360,14 +359,12 @@ public class LineStatusTracker {
if (!changedRanges.equals(newChangedRanges)) {
replaceRanges(changedRanges, newChangedRanges);
myRanges = new ArrayList<Range>();
myRanges = new ArrayList<Range>(rangesBeforeChange.size() + newChangedRanges.size() + rangesAfterChange.size());
myRanges.addAll(rangesBeforeChange);
myRanges.addAll(newChangedRanges);
myRanges.addAll(rangesAfterChange);
myRanges = mergeRanges(myRanges);
for (Range range : myRanges) {
if (!range.hasHighlighter()) range.setHighlighter(createHighlighter(range));
}
@@ -414,32 +411,6 @@ public class LineStatusTracker {
return new RangesBuilder(lines, uLines, firstChangedLine, upToDateFirstLine).getRanges();
}
@NotNull
private List<Range> mergeRanges(@NotNull List<Range> ranges) {
ArrayList<Range> result = new ArrayList<Range>();
Iterator<Range> iterator = ranges.iterator();
if (!iterator.hasNext()) return result;
Range prev = iterator.next();
while (iterator.hasNext()) {
Range range = iterator.next();
if (prev.canBeMergedWith(range)) {
if (range.getHighlighter() != null) {
range.getHighlighter().dispose();
}
if (prev.getHighlighter() != null) {
prev.getHighlighter().dispose();
}
prev = prev.mergeWith(range);
}
else {
result.add(prev);
prev = range;
}
}
result.add(prev);
return result;
}
private void replaceRanges(@NotNull List<Range> rangesInChange, @NotNull List<Range> newRangesInChange) {
for (Range range : rangesInChange) {
if (range.getHighlighter() != null) {