Skip to content

Commit fedc809

Browse files
author
steveluc
committed
Added guards for end of file edits.
1 parent 35bfe4e commit fedc809

1 file changed

Lines changed: 19 additions & 17 deletions

File tree

src/server/editorServices.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,7 +1063,7 @@ module ts.server {
10631063
}
10641064
}
10651065

1066-
class ScriptVersionCache {
1066+
export class ScriptVersionCache {
10671067
changes: TextChange[] = [];
10681068
versions: LineIndexSnapshot[] = [];
10691069
minVersion = 0; // no versions earlier than min version will maintain change history
@@ -1216,7 +1216,7 @@ module ts.server {
12161216
}
12171217
}
12181218

1219-
class LineIndex {
1219+
export class LineIndex {
12201220
root: LineNode;
12211221
// set this to true to check each edit for accuracy
12221222
checkEdits = false;
@@ -1304,7 +1304,20 @@ module ts.server {
13041304
var checkText = editFlat(this.getText(0, this.root.charCount()), pos, deleteLength, newText);
13051305
}
13061306
var walker = new EditWalker();
1307-
if (deleteLength > 0) {
1307+
if (pos >= this.root.charCount()) {
1308+
// insert at end
1309+
pos = this.root.charCount() - 1;
1310+
var endString = this.getText(pos, 1);
1311+
if (newText) {
1312+
newText = endString + newText;
1313+
}
1314+
else {
1315+
newText = endString;
1316+
}
1317+
deleteLength = 0;
1318+
walker.suppressTrailingText = true;
1319+
}
1320+
else if (deleteLength > 0) {
13081321
// check whether last characters deleted are line break
13091322
var e = pos + deleteLength;
13101323
var lineInfo = this.charOffsetToLineNumberAndPos(e);
@@ -1320,21 +1333,10 @@ module ts.server {
13201333
}
13211334
}
13221335
}
1323-
else if (pos >= this.root.charCount()) {
1324-
// insert at end
1325-
pos = this.root.charCount() - 1;
1326-
var endString = this.getText(pos, 1);
1327-
if (newText) {
1328-
newText = endString + newText;
1329-
}
1330-
else {
1331-
newText = endString;
1332-
}
1333-
deleteLength = 0;
1334-
walker.suppressTrailingText = true;
1336+
if (pos < this.root.charCount()) {
1337+
this.root.walk(pos, deleteLength, walker);
1338+
walker.insertLines(newText);
13351339
}
1336-
this.root.walk(pos, deleteLength, walker);
1337-
walker.insertLines(newText);
13381340
if (this.checkEdits) {
13391341
var updatedText = this.getText(0, this.root.charCount());
13401342
Debug.assert(checkText == updatedText, "buffer edit mismatch");

0 commit comments

Comments
 (0)