From a9a2fe501a88334c633cc359f8ea44ad19523769 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 4 Nov 2014 19:30:28 -0800 Subject: [PATCH] Specialize computeData for arrays. --- src/services/syntax/syntaxElement.ts | 41 ++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/services/syntax/syntaxElement.ts b/src/services/syntax/syntaxElement.ts index 4b1b1123f0d..0aa91d0aef0 100644 --- a/src/services/syntax/syntaxElement.ts +++ b/src/services/syntax/syntaxElement.ts @@ -334,27 +334,52 @@ module TypeScript { return info; } - function computeData(element: ISyntaxElement): number { - var slotCount = childCount(element); + function combineData(fullWidth: number, isIncrementallyUnusable: boolean) { + return (fullWidth << SyntaxConstants.NodeFullWidthShift) + | (isIncrementallyUnusable ? SyntaxConstants.NodeIncrementallyUnusableMask : 0) + | SyntaxConstants.NodeDataComputed; + } + function listComputeData(list: ISyntaxNodeOrToken[]): number { var fullWidth = 0; + var isIncrementallyUnusable = false; + + for (var i = 0, n = list.length; i < n; i++) { + var child: ISyntaxElement = list[i]; + + fullWidth += TypeScript.fullWidth(child); + isIncrementallyUnusable = isIncrementallyUnusable || TypeScript.isIncrementallyUnusable(child); + } + + return combineData(fullWidth, isIncrementallyUnusable); + } + + function computeData(element: ISyntaxElement): number { + if (isList(element)) { + return listComputeData(element); + } + else { + return nodeOrTokenComputeData(element); + } + } + + function nodeOrTokenComputeData(nodeOrToken: ISyntaxNodeOrToken) { + var fullWidth = 0; + var slotCount = nodeOrToken.childCount; // If we have no children (like an OmmittedExpressionSyntax), we're automatically not reusable. - var isIncrementallyUnusable = slotCount === 0 && !isList(element); + var isIncrementallyUnusable = slotCount === 0; for (var i = 0, n = slotCount; i < n; i++) { - var child = childAt(element, i); + var child = nodeOrToken.childAt(i); if (child) { fullWidth += TypeScript.fullWidth(child); - isIncrementallyUnusable = isIncrementallyUnusable || TypeScript.isIncrementallyUnusable(child); } } - return (fullWidth << SyntaxConstants.NodeFullWidthShift) - | (isIncrementallyUnusable ? SyntaxConstants.NodeIncrementallyUnusableMask : 0) - | SyntaxConstants.NodeDataComputed; + return combineData(fullWidth, isIncrementallyUnusable); } export function start(element: ISyntaxElement, text?: ISimpleText): number {