From 2c4801ea4731ffe11f44b7bef8abecdd1e6ed4e4 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 15 May 2015 14:28:02 -0700 Subject: [PATCH 1/3] during file update request only changed portion of the text from the host --- src/services/services.ts | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index 9fb495ee931..3f3e40da367 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1829,7 +1829,34 @@ module ts { if (version !== sourceFile.version) { // Once incremental parsing is ready, then just call into this function. if (!disableIncrementalParsing) { - let newSourceFile = updateSourceFile(sourceFile, scriptSnapshot.getText(0, scriptSnapshot.getLength()), textChangeRange, aggressiveChecks); + let newText: string; + + // grab the fragment from the beginning of the original text to the beginning of the span + let prefix = textChangeRange.span.start !== 0 + ? sourceFile.text.substr(0, textChangeRange.span.start) + : ""; + + // grab the fragment from the end of the span till the end of the original text + let suffix = textChangeRange.span.start + textChangeRange.span.length !== sourceFile.text.length + ? sourceFile.text.substr(textChangeRange.span.start + textChangeRange.span.length) + : ""; + + if (textChangeRange.newLength === 0) { + // edit was a deletion - just combine prefix and suffix + newText = prefix && suffix ? prefix + suffix : prefix || suffix; + } + else { + // it was actual edit, fetch the fragment of new text that correspond to new span + let changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); + // combine prefix, changed text and suffix + newText = prefix && suffix + ? prefix + changedText + suffix + : prefix + ? (prefix + changedText) + : (changedText + suffix); + } + + let newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); setSourceFileFields(newSourceFile, scriptSnapshot, version); // after incremental parsing nameTable might not be up-to-date // drop it so it can be lazily recreated later From d3a2dc0c644c882b7947dba014baa582ed2d6cdd Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 15 May 2015 15:28:02 -0700 Subject: [PATCH 2/3] addressed PR feedback --- src/services/services.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 3f3e40da367..a799f421239 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1836,9 +1836,10 @@ module ts { ? sourceFile.text.substr(0, textChangeRange.span.start) : ""; + let textChangeRangeEnd = textChangeRange.span.start + textChangeRange.span.length; // grab the fragment from the end of the span till the end of the original text - let suffix = textChangeRange.span.start + textChangeRange.span.length !== sourceFile.text.length - ? sourceFile.text.substr(textChangeRange.span.start + textChangeRange.span.length) + let suffix = textChangeRangeEnd !== sourceFile.text.length + ? sourceFile.text.substr(textChangeRangeEnd) : ""; if (textChangeRange.newLength === 0) { From 66a91c33fb8df028c253fde6471509a8e834ad76 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 15 May 2015 16:36:58 -0700 Subject: [PATCH 3/3] use textSpanEnd instead of handrolled version --- src/services/services.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index a799f421239..a6a26f0b60b 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1836,11 +1836,10 @@ module ts { ? sourceFile.text.substr(0, textChangeRange.span.start) : ""; - let textChangeRangeEnd = textChangeRange.span.start + textChangeRange.span.length; // grab the fragment from the end of the span till the end of the original text - let suffix = textChangeRangeEnd !== sourceFile.text.length - ? sourceFile.text.substr(textChangeRangeEnd) - : ""; + let suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length + ? sourceFile.text.substr(textSpanEnd(textChangeRange.span)) + : ""; if (textChangeRange.newLength === 0) { // edit was a deletion - just combine prefix and suffix