Skip to content

Commit 5775d27

Browse files
committed
respect initial order of changes
1 parent d4bb267 commit 5775d27

File tree

3 files changed

+46
-6
lines changed

3 files changed

+46
-6
lines changed

src/harness/unittests/textChanges.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,5 +650,22 @@ import {
650650
changeTracker.insertNodeInListAfter(sourceFile, findChild("x", sourceFile), createImportSpecifier(undefined, createIdentifier("a")));
651651
})
652652
}
653+
{
654+
const text = `
655+
class A {
656+
x;
657+
}`;
658+
runSingleFileTest("insertNodeAfterMultipleNodes", noop, text, /*validateNodes*/ false, (sourceFile, changeTracker) => {
659+
let newNodes = [];
660+
for (let i = 0; i < 11 /*error doesn't occur with fewer nodes*/; ++i) {
661+
newNodes.push(
662+
createProperty(undefined, undefined, i + "", undefined, undefined, undefined));
663+
}
664+
const insertAfter = findChild("x", sourceFile);
665+
for (const newNode of newNodes) {
666+
changeTracker.insertNodeAfter(sourceFile, insertAfter, newNode, { suffix: newLineCharacter });
667+
}
668+
});
669+
}
653670
});
654671
}

src/services/textChanges.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -407,10 +407,8 @@ namespace ts.textChanges {
407407
changesPerFile.forEachValue(path => {
408408
const changesInFile = changesPerFile.get(path);
409409
const sourceFile = changesInFile[0].sourceFile;
410-
ChangeTracker.normalize(changesInFile);
411-
412410
const fileTextChanges: FileTextChanges = { fileName: sourceFile.fileName, textChanges: [] };
413-
for (const c of changesInFile) {
411+
for (const c of ChangeTracker.normalize(changesInFile)) {
414412
fileTextChanges.textChanges.push({
415413
span: this.computeSpan(c, sourceFile),
416414
newText: this.computeNewText(c, sourceFile)
@@ -463,11 +461,15 @@ namespace ts.textChanges {
463461

464462
private static normalize(changes: Change[]) {
465463
// order changes by start position
466-
changes.sort((a, b) => a.range.pos - b.range.pos);
464+
const normalized = changes
465+
.map((c, i) => ({ c, i }))
466+
.sort(({ c: a, i: i1 }, { c: b, i: i2 }) => (a.range.pos - b.range.pos) || i1 - i2)
467+
.map(({ c }) => c);
467468
// verify that end position of the change is less than start position of the next change
468-
for (let i = 0; i < changes.length - 2; i++) {
469-
Debug.assert(changes[i].range.end <= changes[i + 1].range.pos);
469+
for (let i = 0; i < normalized.length - 2; i++) {
470+
Debug.assert(normalized[i].range.end <= normalized[i + 1].range.pos);
470471
}
472+
return normalized;
471473
}
472474
}
473475

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
===ORIGINAL===
2+
3+
class A {
4+
x;
5+
}
6+
===MODIFIED===
7+
8+
class A {
9+
x;
10+
0;
11+
1;
12+
2;
13+
3;
14+
4;
15+
5;
16+
6;
17+
7;
18+
8;
19+
9;
20+
10;
21+
}

0 commit comments

Comments
 (0)