IDEA-120993 diff: fix diff range calculation in case of newline at the beginning of file

In case of empty range of one side we must return TextRange(n, n-1).

Previously, it was made by correctRangeEnd():
begin/end offsets are at the start of the same line -> we shift end one char backwards (because previous symbol is "\n") -> we got what we want
But in case of first line there are no "\n" that will move us from 0 line to -1 (because this is beginning of file).
This commit is contained in:
Aleksey Pivovarov
2014-02-21 12:38:04 +04:00
parent 41921f74ae
commit 644139eb2f
@@ -15,7 +15,6 @@
*/
package com.intellij.openapi.vcs.changes;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.diff.impl.ComparisonPolicy;
import com.intellij.openapi.diff.impl.external.DiffManagerImpl;
@@ -153,12 +152,18 @@ public class FragmentedDiffRequestFromChange {
if (!lineFragment.isEqual()) {
final TextRange oldRange = lineFragment.getRange(FragmentSide.SIDE1);
final TextRange newRange = lineFragment.getRange(FragmentSide.SIDE2);
myRanges.add(new BeforeAfter<TextRange>(new UnfairTextRange(myOldDocument.getLineNumber(oldRange.getStartOffset()),
myOldDocument.getLineNumber(
correctRangeEnd(oldRange.getEndOffset(), myOldDocument))),
new UnfairTextRange(myDocument.getLineNumber(newRange.getStartOffset()), myDocument
.getLineNumber(correctRangeEnd(newRange.getEndOffset(), myDocument)))
));
int beforeBegin = myOldDocument.getLineNumber(oldRange.getStartOffset());
int beforeEnd = myOldDocument.getLineNumber(correctRangeEnd(oldRange.getEndOffset(), myOldDocument));
int afterBegin = myDocument.getLineNumber(newRange.getStartOffset());
int afterEnd = myDocument.getLineNumber(correctRangeEnd(newRange.getEndOffset(), myDocument));
if (oldRange.isEmpty()) {
beforeEnd = beforeBegin - 1;
}
if (newRange.isEmpty()) {
afterEnd = afterBegin - 1;
}
myRanges
.add(new BeforeAfter<TextRange>(new UnfairTextRange(beforeBegin, beforeEnd), new UnfairTextRange(afterBegin, afterEnd)));
}
}
cache