From 3929ea094101c2e9535ea030c38f5cf91be629ca Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 26 Apr 2018 12:46:47 +0200 Subject: [PATCH] Fixes #48741: Sort reverse edit operations only if order is not significant --- .../pieceTreeTextBuffer.ts | 16 ++++++++++---- .../common/model/editableTextModel.test.ts | 22 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts index 27416907f49..7e5ad2bb133 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts @@ -206,13 +206,17 @@ export class PieceTreeTextBuffer implements ITextBuffer { // Sort operations ascending operations.sort(PieceTreeTextBuffer._sortOpsAscending); + let hasTouchingRanges = false; for (let i = 0, count = operations.length - 1; i < count; i++) { let rangeEnd = operations[i].range.getEndPosition(); let nextRangeStart = operations[i + 1].range.getStartPosition(); - if (nextRangeStart.isBefore(rangeEnd)) { - // overlapping ranges - throw new Error('Overlapping ranges are not allowed!'); + if (nextRangeStart.isBeforeOrEqual(rangeEnd)) { + if (nextRangeStart.isBefore(rangeEnd)) { + // overlapping ranges + throw new Error('Overlapping ranges are not allowed!'); + } + hasTouchingRanges = true; } } @@ -256,7 +260,11 @@ export class PieceTreeTextBuffer implements ITextBuffer { forceMoveMarkers: op.forceMoveMarkers }; } - reverseOperations.sort((a, b) => a.sortIndex - b.sortIndex); + + // Can only sort reverse operations when the order is not significant + if (!hasTouchingRanges) { + reverseOperations.sort((a, b) => a.sortIndex - b.sortIndex); + } this._mightContainRTL = mightContainRTL; this._mightContainNonBasicASCII = mightContainNonBasicASCII; diff --git a/src/vs/editor/test/common/model/editableTextModel.test.ts b/src/vs/editor/test/common/model/editableTextModel.test.ts index fa41d0d5f49..480fdc82c47 100644 --- a/src/vs/editor/test/common/model/editableTextModel.test.ts +++ b/src/vs/editor/test/common/model/editableTextModel.test.ts @@ -1091,4 +1091,26 @@ suite('EditorModel - EditableTextModel.applyEdits', () => { model.dispose(); }); + + test('issue #48741: Broken undo stack with move lines up with multiple cursors', () => { + let model = createEditableTextModelFromString([ + 'line1', + 'line2', + 'line3', + '', + ].join('\n')); + + const undoEdits = model.applyEdits([ + { range: new Range(4, 1, 4, 1), text: 'line3', }, + { range: new Range(3, 1, 3, 6), text: null, }, + { range: new Range(2, 1, 3, 1), text: null, }, + { range: new Range(3, 6, 3, 6), text: '\nline2' } + ]); + + model.applyEdits(undoEdits); + + assert.deepEqual(model.getValue(), 'line1\nline2\nline3\n'); + + model.dispose(); + }); });