Skip to content

Commit 5712747

Browse files
committed
Move empty document range at EOF to start of removed range
Fixes #3380
1 parent d79c32e commit 5712747

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

bundles/org.eclipse.text/projection/org/eclipse/jface/text/projection/ProjectionDocument.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,9 @@ private void internalRemoveMasterDocumentRange(int offsetInMaster, int lengthInM
417417
if (fragment.getOffset() == offsetInMaster) {
418418
fragment.setOffset(offsetInMaster + lengthInMaster);
419419
fragment.setLength(fragment.getLength() - lengthInMaster);
420+
if (fragment.getLength() == 0 && offsetInMaster != 0 && offsetInMaster + lengthInMaster == getMasterDocument().getLength()) {
421+
fragment.setOffset(offsetInMaster);
422+
}
420423
} else {
421424
// split fragment into three fragments, let position updater remove it
422425

tests/org.eclipse.text.tests/projection/org/eclipse/text/tests/ProjectionDocumentTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.junit.Assert;
2828
import org.junit.Before;
2929
import org.junit.Test;
30+
import org.junit.jupiter.api.Assertions;
3031

3132
import org.eclipse.jface.text.BadLocationException;
3233
import org.eclipse.jface.text.DefaultLineTracker;
@@ -2652,4 +2653,39 @@ public void test29_38() {
26522653
assertTrue(false);
26532654
}
26542655
}
2656+
2657+
@Test
2658+
public void testFullDocumentRangeRemovedAtOnce() throws BadLocationException {
2659+
fSlaveDocument.addMasterDocumentRange(0, fMasterDocument.getLength());
2660+
fSlaveDocument.removeMasterDocumentRange(0, fMasterDocument.getLength());
2661+
Assertions.assertEquals("", fSlaveDocument.get());
2662+
Position[] fragments = fSlaveDocument.getFragments2();
2663+
Assertions.assertEquals(1, fragments.length);
2664+
Assertions.assertEquals(new Position(fMasterDocument.getLength(), 0), fragments[0]);
2665+
}
2666+
2667+
@Test
2668+
public void testFullDocumentRangeRemovedInTwoParts() throws BadLocationException {
2669+
fSlaveDocument.addMasterDocumentRange(0, fMasterDocument.getLength());
2670+
fSlaveDocument.removeMasterDocumentRange(0, 10);
2671+
Assertions.assertEquals(fMasterDocument.getLength() - 10, fSlaveDocument.getLength());
2672+
fSlaveDocument.removeMasterDocumentRange(10, fMasterDocument.getLength() - 10);
2673+
Assertions.assertEquals("", fSlaveDocument.get());
2674+
Position[] fragments = fSlaveDocument.getFragments2();
2675+
Assertions.assertEquals(1, fragments.length);
2676+
Assertions.assertEquals(new Position(10, 0), fragments[0]);
2677+
}
2678+
2679+
@Test
2680+
public void testRemovePartsOfDocument() throws BadLocationException {
2681+
fSlaveDocument.addMasterDocumentRange(0, fMasterDocument.getLength());
2682+
fSlaveDocument.removeMasterDocumentRange(0, 10);
2683+
Assertions.assertEquals(fMasterDocument.getLength() - 10, fSlaveDocument.getLength());
2684+
fSlaveDocument.removeMasterDocumentRange(10, fMasterDocument.getLength() - 20);
2685+
Assertions.assertEquals(fMasterDocument.get(fMasterDocument.getLength() - 10, 10),
2686+
fSlaveDocument.get());
2687+
Position[] fragments = fSlaveDocument.getFragments2();
2688+
Assertions.assertEquals(1, fragments.length);
2689+
Assertions.assertEquals(new Position(fMasterDocument.getLength() - 10, 10), fragments[0]);
2690+
}
26552691
}

0 commit comments

Comments
 (0)