diff --git a/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/serializer/ChangeSerializerTest.xtend b/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/serializer/ChangeSerializerTest.xtend index 2208de622..500f25b47 100644 --- a/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/serializer/ChangeSerializerTest.xtend +++ b/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/serializer/ChangeSerializerTest.xtend @@ -506,6 +506,25 @@ class ChangeSerializerTest { } @Test + def void testAddElementsWithEmptyLineUnix() { + val oldLineSeparator = System.getProperty("line.separator") + System.setProperty("line.separator", "\n") + try { + testAddElementsWithEmptyLine() + } finally { + System.setProperty("line.separator", oldLineSeparator) + } + } + @Test + def void testAddElementsWithEmptyLineWindows() { + val oldLineSeparator = System.getProperty("line.separator") + System.setProperty("line.separator", "\r\n") + try { + testAddElementsWithEmptyLine() + } finally { + System.setProperty("line.separator", oldLineSeparator) + } + } def void testAddElementsWithEmptyLine() { val uri = "inmemory:/file-add.pstl" val fs = new InMemoryURIHandler() diff --git a/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/serializer/ChangeSerializerTest.java b/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/serializer/ChangeSerializerTest.java index 7539f68b7..a55d45fd8 100644 --- a/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/serializer/ChangeSerializerTest.java +++ b/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/serializer/ChangeSerializerTest.java @@ -839,6 +839,27 @@ public class ChangeSerializerTest { } @Test + public void testAddElementsWithEmptyLineUnix() { + final String oldLineSeparator = System.getProperty("line.separator"); + System.setProperty("line.separator", "\n"); + try { + this.testAddElementsWithEmptyLine(); + } finally { + System.setProperty("line.separator", oldLineSeparator); + } + } + + @Test + public void testAddElementsWithEmptyLineWindows() { + final String oldLineSeparator = System.getProperty("line.separator"); + System.setProperty("line.separator", "\r\n"); + try { + this.testAddElementsWithEmptyLine(); + } finally { + System.setProperty("line.separator", oldLineSeparator); + } + } + public void testAddElementsWithEmptyLine() { final String uri = "inmemory:/file-add.pstl"; final InMemoryURIHandler fs = new InMemoryURIHandler(); diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/serializer/impl/RegionDiffFormatter.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/serializer/impl/RegionDiffFormatter.java index 4c694a130..460951320 100644 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/serializer/impl/RegionDiffFormatter.java +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/serializer/impl/RegionDiffFormatter.java @@ -108,7 +108,7 @@ public class RegionDiffFormatter { local.add(re); } else if (hasOverlappingWhitespacePrefix(r, re)) { // change overlaps with a region boundary, trim it to the part within - TextReplacement newReplacement = trimReplacement(re, re.getText()); + TextReplacement newReplacement = trimReplacement(re); if (newReplacement != null) local.add(newReplacement); } @@ -141,14 +141,28 @@ public class RegionDiffFormatter { return false; } - private TextReplacement trimReplacement(ITextReplacement re, String prefixText) { + private TextReplacement trimReplacement(ITextReplacement re) { + String prefixText = re.getText(); TextReplacement newReplacement = null; int prefixLen = prefixText.length(); String newText = re.getReplacementText(); if (newText.length() > prefixLen) { - newText = newText.substring(prefixLen); - int newOffset = re.getOffset()+prefixLen; - int newLength = re.getLength()-prefixLen; + int prefixLenNew = 0; + for (int i = 0; i < prefixLen && prefixLenNew < newText.length(); i++) { + char pchar = prefixText.charAt(i); + char rchar = newText.charAt(prefixLenNew++); + if (pchar != rchar) { + if (pchar == '\n' && rchar == '\r' && prefixLenNew < newText.length() && newText.charAt(prefixLenNew) == '\n') + prefixLenNew++; // found '\n' -> '\r\n', cut off one more char + else + return null; // not a true prefix match + } + } + newText = newText.substring(prefixLenNew); + int newOffset = re.getOffset() + prefixLen; + int newLength = re.getLength() - prefixLen; + if (newLength < 0) + return null; newReplacement = new TextReplacement(re.getTextRegionAccess(), newOffset, newLength, newText); } return newReplacement;