Skip to content

Commit

Permalink
Fixes #46342: Have model.applyEdits maintain order for inverse edits
Browse files Browse the repository at this point in the history
  • Loading branch information
alexdima committed Mar 28, 2018
1 parent 42c8821 commit 3114b0c
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ export interface IValidatedEditOperation {
isAutoWhitespaceEdit: boolean;
}

export interface IReverseSingleEditOperation extends IIdentifiedSingleEditOperation {
sortIndex: number;
}

export class PieceTreeTextBuffer implements ITextBuffer {
private _pieceTree: PieceTreeBase;
private _BOM: string;
Expand Down Expand Up @@ -239,18 +243,20 @@ export class PieceTreeTextBuffer implements ITextBuffer {
}
}

let reverseOperations: IIdentifiedSingleEditOperation[] = [];
let reverseOperations: IReverseSingleEditOperation[] = [];
for (let i = 0; i < operations.length; i++) {
let op = operations[i];
let reverseRange = reverseRanges[i];

reverseOperations[i] = {
sortIndex: op.sortIndex,
identifier: op.identifier,
range: reverseRange,
text: this.getValueInRange(op.range),
forceMoveMarkers: op.forceMoveMarkers
};
}
reverseOperations.sort((a, b) => a.sortIndex - b.sortIndex);

this._mightContainRTL = mightContainRTL;
this._mightContainNonBasicASCII = mightContainNonBasicASCII;
Expand Down
11 changes: 10 additions & 1 deletion src/vs/editor/test/common/model/editableTextModelTestUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,17 @@ export function testApplyEditsWithSyncedModels(original: string[], edits: IIdent
assert.deepEqual(model.getValue(EndOfLinePreference.LF), originalStr);

if (!inputEditsAreInvalid) {
const simplifyEdit = (edit: IIdentifiedSingleEditOperation) => {
return {
identifier: edit.identifier,
range: edit.range,
text: edit.text,
forceMoveMarkers: edit.forceMoveMarkers,
isAutoWhitespaceEdit: edit.isAutoWhitespaceEdit
};
};
// Assert the inverse of the inverse edits are the original edits
assert.deepEqual(inverseInverseEdits, edits);
assert.deepEqual(inverseInverseEdits.map(simplifyEdit), edits.map(simplifyEdit));
}

assertMirrorModels();
Expand Down
10 changes: 10 additions & 0 deletions src/vs/editor/test/common/model/model.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,16 @@ suite('Editor Model - Model', () => {
false
));
});

test('issue #46342: Maintain edit operation order in applyEdits', () => {
let res = thisModel.applyEdits([
{ range: new Range(2, 1, 2, 1), text: 'a' },
{ range: new Range(1, 1, 1, 1), text: 'b' },
]);

assert.deepEqual(res[0].range, new Range(2, 1, 2, 2));
assert.deepEqual(res[1].range, new Range(1, 1, 1, 2));
});
});


Expand Down
11 changes: 10 additions & 1 deletion src/vs/editor/test/common/model/modelEditOperation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,16 @@ suite('Editor Model - Model Edit Operation', () => {
assert.equal(model.getLineContent(4), LINE4);
assert.equal(model.getLineContent(5), LINE5);

assert.deepEqual(originalOp, editOp);
const simplifyEdit = (edit: IIdentifiedSingleEditOperation) => {
return {
identifier: edit.identifier,
range: edit.range,
text: edit.text,
forceMoveMarkers: edit.forceMoveMarkers,
isAutoWhitespaceEdit: edit.isAutoWhitespaceEdit
};
};
assert.deepEqual(originalOp.map(simplifyEdit), editOp.map(simplifyEdit));
}

test('Insert inline', () => {
Expand Down

0 comments on commit 3114b0c

Please sign in to comment.