diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 46959cf435f..784d0de907f 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -705,7 +705,7 @@ module ts { } function update(newText: string, textChangeRange: TextChangeRange) { - if (textChangeRange.isUnchanged()) { + if (textChangeRangeIsUnchanged(textChangeRange)) { // if the text didn't change, then we can just return our current source file as-is. return sourceFile; } @@ -725,7 +725,7 @@ module ts { // The is the amount the nodes after the edit range need to be adjusted. It can be // positive (if the edit added characters), negative (if the edit deleted characters) // or zero (if this was a pure overwrite with nothing added/removed). - var delta = changeRange.newSpan().length - changeRange.span().length; + var delta = textChangeRangeNewSpan(changeRange).length - changeRange.span.length; // If we added or removed characters during the edit, then we need to go and adjust all // the nodes after the edit. Those nodes may move forward down (if we inserted chars) @@ -747,7 +747,7 @@ module ts { // Also, mark any syntax elements that intersect the changed span. We know, up front, // that we cannot reuse these elements. updateTokenPositionsAndMarkElements(sourceFile, - changeRange.span().start, textSpanEnd(changeRange.span()), textSpanEnd(changeRange.newSpan()), delta); + changeRange.span.start, textSpanEnd(changeRange.span), textSpanEnd(textChangeRangeNewSpan(changeRange)), delta); // Now that we've set up our internal incremental state just proceed and parse the // source file in the normal fashion. When possible the parser will retrieve and @@ -936,7 +936,7 @@ module ts { // that the prior token sees that change. var maxLookahead = 1; - var start = changeRange.span().start; + var start = changeRange.span.start; // the first iteration aligns us with the change start. subsequent iteration move us to // the left by maxLookahead tokens. We only need to do this as long as we're not at the @@ -948,8 +948,8 @@ module ts { start = Math.max(0, position - 1); } - var finalSpan = createTextSpanFromBounds(start, textSpanEnd(changeRange.span())); - var finalLength = changeRange.newLength() + (changeRange.span().start - start); + var finalSpan = createTextSpanFromBounds(start, textSpanEnd(changeRange.span)); + var finalLength = changeRange.newLength + (changeRange.span.start - start); return createTextChangeRange(finalSpan, finalLength); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 0707cf9975b..815d2b23e51 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1642,9 +1642,7 @@ module ts { } export interface TextChangeRange { - span(): TextSpan; - newLength(): number; - newSpan(): TextSpan; - isUnchanged(): boolean; + span: TextSpan; + newLength: number; } } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 5d795b1d1ae..4c5f75a319c 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -841,42 +841,34 @@ module ts { } export function createTextSpan(start: number, length: number): TextSpan { + if (start < 0) { + throw new Error("start < 0"); + } + if (length < 0) { + throw new Error("length < 0"); + } + return { start, length }; } export function createTextSpanFromBounds(start: number, end: number) { return createTextSpan(start, end - start); } + + export function textChangeRangeNewSpan(range: TextChangeRange) { + return createTextSpan(range.span.start, range.newLength); + } - var textChangeRangeConstructor = (function () { - function textChangeRangeConstructor(span: TextSpan, newLength: number) { - if (newLength < 0) { - throw new Error("newLength < 0"); - } - this._span = span; - this._newLength = newLength; - } - - textChangeRangeConstructor.prototype = { - span() { - return this._span; - }, - newLength() { - return this._newLength; - }, - newSpan() { - return createTextSpan(this.span().start, this.newLength()); - }, - isUnchanged() { - return textSpanIsEmpty(this.span()) && this.newLength() === 0; - } - }; - - return textChangeRangeConstructor; - })(); + export function textChangeRangeIsUnchanged(range: TextChangeRange) { + return textSpanIsEmpty(range.span) && range.newLength === 0; + } export function createTextChangeRange(span: TextSpan, newLength: number): TextChangeRange { - return new (textChangeRangeConstructor)(span, newLength); + if (newLength < 0) { + throw new Error("newLength < 0"); + } + + return { span, newLength }; } export var unchangedTextChangeRange = createTextChangeRange(createTextSpan(0, 0), 0); @@ -902,9 +894,9 @@ module ts { // as it makes things much easier to reason about. var change0 = changes[0]; - var oldStartN = change0.span().start; - var oldEndN = textSpanEnd(change0.span()); - var newEndN = oldStartN + change0.newLength(); + var oldStartN = change0.span.start; + var oldEndN = textSpanEnd(change0.span); + var newEndN = oldStartN + change0.newLength; for (var i = 1; i < changes.length; i++) { var nextChange = changes[i]; @@ -993,9 +985,9 @@ module ts { var oldEnd1 = oldEndN; var newEnd1 = newEndN; - var oldStart2 = nextChange.span().start; - var oldEnd2 = textSpanEnd(nextChange.span()); - var newEnd2 = oldStart2 + nextChange.newLength(); + var oldStart2 = nextChange.span.start; + var oldEnd2 = textSpanEnd(nextChange.span); + var newEnd2 = oldStart2 + nextChange.newLength; oldStartN = Math.min(oldStart1, oldStart2); oldEndN = Math.max(oldEnd1, oldEnd1 + (oldEnd2 - newEnd1)); diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 23555411989..97885bdd20e 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -87,7 +87,7 @@ module Harness.LanguageService { return null; } - return JSON.stringify({ span: { start: range.span().start, length: range.span().length }, newLength: range.newLength() }); + return JSON.stringify({ span: { start: range.span.start, length: range.span.length }, newLength: range.newLength }); } } diff --git a/src/services/services.ts b/src/services/services.ts index 6fb64baf03f..84811489a7c 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1561,15 +1561,15 @@ module ts { var oldText = sourceFile.scriptSnapshot; var newText = scriptSnapshot; - Debug.assert((oldText.getLength() - textChangeRange.span().length + textChangeRange.newLength()) === newText.getLength()); + Debug.assert((oldText.getLength() - textChangeRange.span.length + textChangeRange.newLength) === newText.getLength()); if (Debug.shouldAssert(AssertionLevel.VeryAggressive)) { - var oldTextPrefix = oldText.getText(0, textChangeRange.span().start); - var newTextPrefix = newText.getText(0, textChangeRange.span().start); + var oldTextPrefix = oldText.getText(0, textChangeRange.span.start); + var newTextPrefix = newText.getText(0, textChangeRange.span.start); Debug.assert(oldTextPrefix === newTextPrefix); - var oldTextSuffix = oldText.getText(textSpanEnd(textChangeRange.span()), oldText.getLength()); - var newTextSuffix = newText.getText(textSpanEnd(textChangeRange.newSpan()), newText.getLength()); + var oldTextSuffix = oldText.getText(textSpanEnd(textChangeRange.span), oldText.getLength()); + var newTextSuffix = newText.getText(textSpanEnd(textChangeRangeNewSpan(textChangeRange)), newText.getLength()); Debug.assert(oldTextSuffix === newTextSuffix); } }