From eb35cd5d592193182ed15b8e1a3640e8c303ef79 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Fri, 21 Nov 2014 15:26:00 -0800 Subject: [PATCH] Speed up incremental parser. --- src/services/syntax/incrementalParser.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/services/syntax/incrementalParser.ts b/src/services/syntax/incrementalParser.ts index 6b562e51c9d..83637f37197 100644 --- a/src/services/syntax/incrementalParser.ts +++ b/src/services/syntax/incrementalParser.ts @@ -700,7 +700,7 @@ module TypeScript.IncrementalParser { } var tokenCollectorWalker = new TokenCollectorWalker(); - function updateTokenPositionsAndMarkElements(element: ISyntaxElementInternal, changeStart: number, changeRangeOldEnd: number, delta: number, fullStart: number): void { + function updateTokenPositionsAndMarkElements(element: ISyntaxElement, changeStart: number, changeRangeOldEnd: number, delta: number, fullStart: number): void { // First, try to skip past any elements that we dont' need to move. We don't need to // move any elements that don't start after the end of the change range. if (fullStart > changeRangeOldEnd) { @@ -714,15 +714,26 @@ module TypeScript.IncrementalParser { // be able to use. var fullEnd = fullStart + fullWidth(element); if (fullEnd >= changeStart) { - element.intersectsChange = true; + (element).intersectsChange = true; - for (var i = 0, n = childCount(element); i < n; i++) { - var child = childAt(element, i); - if (child) { + if (isList(element)) { + var list = element; + for (var i = 0, n = list.length; i < n; i++) { + var child: ISyntaxElement = list[i]; updateTokenPositionsAndMarkElements(child, changeStart, changeRangeOldEnd, delta, fullStart); fullStart += fullWidth(child); } } + else if (isNode(element)) { + var node = element; + for (var i = 0, n = node.childCount; i < n; i++) { + var child = node.childAt(i); + if (child) { + updateTokenPositionsAndMarkElements(child, changeStart, changeRangeOldEnd, delta, fullStart); + fullStart += fullWidth(child); + } + } + } } // else { // This element ended strictly before the edited range. We don't need to do anything