Skip to content

Commit e29b210

Browse files
author
Andy
authored
Improvements to LineIndex.edit (microsoft#17056)
1 parent dab6827 commit e29b210

File tree

1 file changed

+13
-14
lines changed

1 file changed

+13
-14
lines changed

src/server/scriptVersionCache.ts

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,9 @@ namespace ts.server {
279279
// REVIEW: can optimize by coalescing simple edits
280280
edit(pos: number, deleteLen: number, insertedText?: string) {
281281
this.changes.push(new TextChange(pos, deleteLen, insertedText));
282-
if ((this.changes.length > ScriptVersionCache.changeNumberThreshold) ||
283-
(deleteLen > ScriptVersionCache.changeLengthThreshold) ||
284-
(insertedText && (insertedText.length > ScriptVersionCache.changeLengthThreshold))) {
282+
if (this.changes.length > ScriptVersionCache.changeNumberThreshold ||
283+
deleteLen > ScriptVersionCache.changeLengthThreshold ||
284+
insertedText && insertedText.length > ScriptVersionCache.changeLengthThreshold) {
285285
this.getSnapshot();
286286
}
287287
}
@@ -471,12 +471,9 @@ namespace ts.server {
471471
return !walkFns.done;
472472
}
473473

474-
edit(pos: number, deleteLength: number, newText?: string) {
475-
function editFlat(source: string, s: number, dl: number, nt = "") {
476-
return source.substring(0, s) + nt + source.substring(s + dl, source.length);
477-
}
474+
edit(pos: number, deleteLength: number, newText?: string): LineIndex {
478475
if (this.root.charCount() === 0) {
479-
// TODO: assert deleteLength === 0
476+
Debug.assert(deleteLength === 0); // Can't delete from empty document
480477
if (newText !== undefined) {
481478
this.load(LineIndex.linesFromText(newText).lines);
482479
return this;
@@ -485,7 +482,8 @@ namespace ts.server {
485482
else {
486483
let checkText: string;
487484
if (this.checkEdits) {
488-
checkText = editFlat(this.getText(0, this.root.charCount()), pos, deleteLength, newText);
485+
const source = this.getText(0, this.root.charCount());
486+
checkText = source.slice(0, pos) + newText + source.slice(pos + deleteLength);
489487
}
490488
const walker = new EditWalker();
491489
let suppressTrailingText = false;
@@ -513,14 +511,15 @@ namespace ts.server {
513511
newText = newText ? newText + lineText : lineText;
514512
}
515513
}
516-
if (pos < this.root.charCount()) {
517-
this.root.walk(pos, deleteLength, walker);
518-
walker.insertLines(newText, suppressTrailingText);
519-
}
514+
515+
this.root.walk(pos, deleteLength, walker);
516+
walker.insertLines(newText, suppressTrailingText);
517+
520518
if (this.checkEdits) {
521-
const updatedText = this.getText(0, this.root.charCount());
519+
const updatedText = walker.lineIndex.getText(0, walker.lineIndex.getLength());
522520
Debug.assert(checkText === updatedText, "buffer edit mismatch");
523521
}
522+
524523
return walker.lineIndex;
525524
}
526525
}

0 commit comments

Comments
 (0)