From 30f9a5ca2adbee04df74e957d57bb69db5325139 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 15 Dec 2014 21:41:02 -0800 Subject: [PATCH] Do not pass context flags downward while parsing binding elements. This prevents an unnecessary allocation, simplifies parsing code, and prevents an issue where parsing depends on context flags not stored in the final tree. This is an issue for incremental parsing that can lead to nodes being reused inappropriately. --- src/compiler/parser.ts | 43 +++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index ea5b35cbce1..582924df04b 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -3277,38 +3277,39 @@ module ts { // DECLARATIONS - function parseBindingElement(context: ParsingContext): BindingElement { - if (context === ParsingContext.ArrayBindingElements && token === SyntaxKind.CommaToken) { + function parseArrayBindingElement(): BindingElement { + if (token === SyntaxKind.CommaToken) { return createNode(SyntaxKind.OmittedExpression); } + var node = createNode(SyntaxKind.BindingElement); - if (context === ParsingContext.ObjectBindingElements) { - // TODO(andersh): Handle computed properties - var id = parsePropertyName(); - if (id.kind === SyntaxKind.Identifier && token !== SyntaxKind.ColonToken) { - node.name = id; - } - else { - parseExpected(SyntaxKind.ColonToken); - node.propertyName = id; - node.name = parseIdentifierOrPattern(); - } - } - else { - node.name = parseIdentifierOrPattern(); - } + node.name = parseIdentifierOrPattern(); node.initializer = parseInitializer(/*inParameter*/ false); return finishNode(node); } - function parseBindingList(context: ParsingContext): NodeArray { - return parseDelimitedList(context, () => parseBindingElement(context)); + function parseObjectBindingElement(): BindingElement { + var node = createNode(SyntaxKind.BindingElement); + + // TODO(andersh): Handle computed properties + var id = parsePropertyName(); + if (id.kind === SyntaxKind.Identifier && token !== SyntaxKind.ColonToken) { + node.name = id; + } + else { + parseExpected(SyntaxKind.ColonToken); + node.propertyName = id; + node.name = parseIdentifierOrPattern(); + } + + node.initializer = parseInitializer(/*inParameter*/ false); + return finishNode(node); } function parseObjectBindingPattern(): BindingPattern { var node = createNode(SyntaxKind.ObjectBindingPattern); parseExpected(SyntaxKind.OpenBraceToken); - node.elements = parseBindingList(ParsingContext.ObjectBindingElements); + node.elements = parseDelimitedList(ParsingContext.ObjectBindingElements, parseObjectBindingElement); parseExpected(SyntaxKind.CloseBraceToken); return finishNode(node); } @@ -3316,7 +3317,7 @@ module ts { function parseArrayBindingPattern(): BindingPattern { var node = createNode(SyntaxKind.ArrayBindingPattern); parseExpected(SyntaxKind.OpenBracketToken); - node.elements = parseBindingList(ParsingContext.ArrayBindingElements); + node.elements = parseDelimitedList(ParsingContext.ArrayBindingElements, parseArrayBindingElement); parseExpected(SyntaxKind.CloseBracketToken); return finishNode(node); }