From 644139eb2fbd367adbbd0e96ffdbe2dc381cf7cb Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 21 Feb 2014 12:36:04 +0400 Subject: [PATCH] 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). --- .../FragmentedDiffRequestFromChange.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FragmentedDiffRequestFromChange.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FragmentedDiffRequestFromChange.java index 5b44749b8a82..5b95283e1b30 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FragmentedDiffRequestFromChange.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FragmentedDiffRequestFromChange.java @@ -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(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(new UnfairTextRange(beforeBegin, beforeEnd), new UnfairTextRange(afterBegin, afterEnd))); } } cache