From bdfb655d6659d913f09067cad859b3bc70bb33aa Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Thu, 8 Jan 2015 18:46:48 -0800 Subject: [PATCH] Renaming helpers and cleaning up logic --- src/compiler/parser.ts | 279 ++++++++++++++++++++--------------------- 1 file changed, 137 insertions(+), 142 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 87f4c20c97d..3fd2bbf4676 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -12,18 +12,18 @@ module ts { return new (getNodeConstructor(kind))(); } - function child(cbNode: (node: Node) => T, node: Node): T { + function visitNode(cbNode: (node: Node) => T, node: Node): T { return node ? cbNode(node) : void 0; } - function children1(cbNodes: (nodes: Node[]) => T, nodes: Node[]) { + function visitNodeArray(cbNodes: (nodes: Node[]) => T, nodes: Node[]) { return nodes ? cbNodes(nodes) : void 0; } - function children2(cbNode: (node: Node) => T, nodes: Node[]) { + function visitEachNode(cbNode: (node: Node) => T, nodes: Node[]) { if (nodes) { for (var i = 0, len = nodes.length; i < len; i++) { - var result = cbNode(nodes[i]) + var result = cbNode(nodes[i]); if (result) { return result; } @@ -35,25 +35,20 @@ module ts { // stored in properties. If a 'cbNodes' callback is specified, it is invoked for embedded arrays; otherwise, // embedded arrays are flattened and the 'cbNode' callback is invoked for each element. If a callback returns // a truthy value, iteration stops and that value is returned. Otherwise, undefined is returned. - export function forEachChild(node: Node, cbNode: (node: Node) => T, cbNodes?: (nodes: Node[]) => T): T { + export function forEachChild(node: Node, cbNode: (node: Node) => T, cbNodeArray?: (nodes: Node[]) => T): T { if (!node) { return; } - if (cbNodes) { - var children = children1; - } - else { - cbNodes = cbNode; - children = children2; - } + var visitNodes: (cb: (node: Node | Node[]) => T, nodes: Node[]) => T = cbNodeArray ? visitNodeArray : visitEachNode; + var cbNodes = cbNodeArray || cbNode; switch (node.kind) { case SyntaxKind.QualifiedName: - return child(cbNode, (node).left) || - child(cbNode, (node).right); + return visitNode(cbNode, (node).left) || + visitNode(cbNode, (node).right); case SyntaxKind.TypeParameter: - return child(cbNode, (node).name) || - child(cbNode, (node).constraint) || - child(cbNode, (node).expression); + return visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).constraint) || + visitNode(cbNode, (node).expression); case SyntaxKind.Parameter: case SyntaxKind.PropertyDeclaration: case SyntaxKind.PropertySignature: @@ -61,22 +56,22 @@ module ts { case SyntaxKind.ShorthandPropertyAssignment: case SyntaxKind.VariableDeclaration: case SyntaxKind.BindingElement: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).propertyName) || - child(cbNode, (node).dotDotDotToken) || - child(cbNode, (node).name) || - child(cbNode, (node).questionToken) || - child(cbNode, (node).type) || - child(cbNode, (node).initializer); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).propertyName) || + visitNode(cbNode, (node).dotDotDotToken) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).questionToken) || + visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).initializer); case SyntaxKind.FunctionType: case SyntaxKind.ConstructorType: case SyntaxKind.CallSignature: case SyntaxKind.ConstructSignature: case SyntaxKind.IndexSignature: - return children(cbNodes, node.modifiers) || - children(cbNodes, (node).typeParameters) || - children(cbNodes, (node).parameters) || - child(cbNode, (node).type); + return visitNodes(cbNodes, node.modifiers) || + visitNodes(cbNodes, (node).typeParameters) || + visitNodes(cbNodes, (node).parameters) || + visitNode(cbNode, (node).type); case SyntaxKind.MethodDeclaration: case SyntaxKind.MethodSignature: case SyntaxKind.Constructor: @@ -85,182 +80,182 @@ module ts { case SyntaxKind.FunctionExpression: case SyntaxKind.FunctionDeclaration: case SyntaxKind.ArrowFunction: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).asteriskToken) || - child(cbNode, (node).name) || - child(cbNode, (node).questionToken) || - children(cbNodes, (node).typeParameters) || - children(cbNodes, (node).parameters) || - child(cbNode, (node).type) || - child(cbNode, (node).body); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).asteriskToken) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).questionToken) || + visitNodes(cbNodes, (node).typeParameters) || + visitNodes(cbNodes, (node).parameters) || + visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).body); case SyntaxKind.TypeReference: - return child(cbNode, (node).typeName) || - children(cbNodes, (node).typeArguments); + return visitNode(cbNode, (node).typeName) || + visitNodes(cbNodes, (node).typeArguments); case SyntaxKind.TypeQuery: - return child(cbNode, (node).exprName); + return visitNode(cbNode, (node).exprName); case SyntaxKind.TypeLiteral: - return children(cbNodes, (node).members); + return visitNodes(cbNodes, (node).members); case SyntaxKind.ArrayType: - return child(cbNode, (node).elementType); + return visitNode(cbNode, (node).elementType); case SyntaxKind.TupleType: - return children(cbNodes, (node).elementTypes); + return visitNodes(cbNodes, (node).elementTypes); case SyntaxKind.UnionType: - return children(cbNodes, (node).types); + return visitNodes(cbNodes, (node).types); case SyntaxKind.ParenthesizedType: - return child(cbNode, (node).type); + return visitNode(cbNode, (node).type); case SyntaxKind.ObjectBindingPattern: case SyntaxKind.ArrayBindingPattern: - return children(cbNodes, (node).elements); + return visitNodes(cbNodes, (node).elements); case SyntaxKind.ArrayLiteralExpression: - return children(cbNodes, (node).elements); + return visitNodes(cbNodes, (node).elements); case SyntaxKind.ObjectLiteralExpression: - return children(cbNodes, (node).properties); + return visitNodes(cbNodes, (node).properties); case SyntaxKind.PropertyAccessExpression: - return child(cbNode, (node).expression) || - child(cbNode, (node).name); + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).name); case SyntaxKind.ElementAccessExpression: - return child(cbNode, (node).expression) || - child(cbNode, (node).argumentExpression); + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).argumentExpression); case SyntaxKind.CallExpression: case SyntaxKind.NewExpression: - return child(cbNode, (node).expression) || - children(cbNodes, (node).typeArguments) || - children(cbNodes, (node).arguments); + return visitNode(cbNode, (node).expression) || + visitNodes(cbNodes, (node).typeArguments) || + visitNodes(cbNodes, (node).arguments); case SyntaxKind.TaggedTemplateExpression: - return child(cbNode, (node).tag) || - child(cbNode, (node).template); + return visitNode(cbNode, (node).tag) || + visitNode(cbNode, (node).template); case SyntaxKind.TypeAssertionExpression: - return child(cbNode, (node).type) || - child(cbNode, (node).expression); + return visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).expression); case SyntaxKind.ParenthesizedExpression: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.DeleteExpression: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.TypeOfExpression: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.VoidExpression: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.PrefixUnaryExpression: - return child(cbNode, (node).operand); + return visitNode(cbNode, (node).operand); case SyntaxKind.YieldExpression: - return child(cbNode, (node).asteriskToken) || - child(cbNode, (node).expression); + return visitNode(cbNode, (node).asteriskToken) || + visitNode(cbNode, (node).expression); case SyntaxKind.PostfixUnaryExpression: - return child(cbNode, (node).operand); + return visitNode(cbNode, (node).operand); case SyntaxKind.BinaryExpression: - return child(cbNode, (node).left) || - child(cbNode, (node).right); + return visitNode(cbNode, (node).left) || + visitNode(cbNode, (node).right); case SyntaxKind.ConditionalExpression: - return child(cbNode, (node).condition) || - child(cbNode, (node).whenTrue) || - child(cbNode, (node).whenFalse); + return visitNode(cbNode, (node).condition) || + visitNode(cbNode, (node).whenTrue) || + visitNode(cbNode, (node).whenFalse); case SyntaxKind.SpreadElementExpression: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.Block: case SyntaxKind.ModuleBlock: - return children(cbNodes, (node).statements); + return visitNodes(cbNodes, (node).statements); case SyntaxKind.SourceFile: - return children(cbNodes, (node).statements) || - child(cbNode, (node).endOfFileToken); + return visitNodes(cbNodes, (node).statements) || + visitNode(cbNode, (node).endOfFileToken); case SyntaxKind.VariableStatement: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).declarationList); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).declarationList); case SyntaxKind.VariableDeclarationList: - return children(cbNodes, (node).declarations); + return visitNodes(cbNodes, (node).declarations); case SyntaxKind.ExpressionStatement: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.IfStatement: - return child(cbNode, (node).expression) || - child(cbNode, (node).thenStatement) || - child(cbNode, (node).elseStatement); + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).thenStatement) || + visitNode(cbNode, (node).elseStatement); case SyntaxKind.DoStatement: - return child(cbNode, (node).statement) || - child(cbNode, (node).expression); + return visitNode(cbNode, (node).statement) || + visitNode(cbNode, (node).expression); case SyntaxKind.WhileStatement: - return child(cbNode, (node).expression) || - child(cbNode, (node).statement); + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).statement); case SyntaxKind.ForStatement: - return child(cbNode, (node).initializer) || - child(cbNode, (node).condition) || - child(cbNode, (node).iterator) || - child(cbNode, (node).statement); + return visitNode(cbNode, (node).initializer) || + visitNode(cbNode, (node).condition) || + visitNode(cbNode, (node).iterator) || + visitNode(cbNode, (node).statement); case SyntaxKind.ForInStatement: - return child(cbNode, (node).initializer) || - child(cbNode, (node).expression) || - child(cbNode, (node).statement); + return visitNode(cbNode, (node).initializer) || + visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).statement); case SyntaxKind.ContinueStatement: case SyntaxKind.BreakStatement: - return child(cbNode, (node).label); + return visitNode(cbNode, (node).label); case SyntaxKind.ReturnStatement: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.WithStatement: - return child(cbNode, (node).expression) || - child(cbNode, (node).statement); + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).statement); case SyntaxKind.SwitchStatement: - return child(cbNode, (node).expression) || - children(cbNodes, (node).clauses); + return visitNode(cbNode, (node).expression) || + visitNodes(cbNodes, (node).clauses); case SyntaxKind.CaseClause: - return child(cbNode, (node).expression) || - children(cbNodes, (node).statements); + return visitNode(cbNode, (node).expression) || + visitNodes(cbNodes, (node).statements); case SyntaxKind.DefaultClause: - return children(cbNodes, (node).statements); + return visitNodes(cbNodes, (node).statements); case SyntaxKind.LabeledStatement: - return child(cbNode, (node).label) || - child(cbNode, (node).statement); + return visitNode(cbNode, (node).label) || + visitNode(cbNode, (node).statement); case SyntaxKind.ThrowStatement: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.TryStatement: - return child(cbNode, (node).tryBlock) || - child(cbNode, (node).catchClause) || - child(cbNode, (node).finallyBlock); + return visitNode(cbNode, (node).tryBlock) || + visitNode(cbNode, (node).catchClause) || + visitNode(cbNode, (node).finallyBlock); case SyntaxKind.CatchClause: - return child(cbNode, (node).name) || - child(cbNode, (node).type) || - child(cbNode, (node).block); + return visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).block); case SyntaxKind.ClassDeclaration: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).name) || - children(cbNodes, (node).typeParameters) || - children(cbNodes, (node).heritageClauses) || - children(cbNodes, (node).members); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNodes(cbNodes, (node).typeParameters) || + visitNodes(cbNodes, (node).heritageClauses) || + visitNodes(cbNodes, (node).members); case SyntaxKind.InterfaceDeclaration: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).name) || - children(cbNodes, (node).typeParameters) || - children(cbNodes, (node).heritageClauses) || - children(cbNodes, (node).members); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNodes(cbNodes, (node).typeParameters) || + visitNodes(cbNodes, (node).heritageClauses) || + visitNodes(cbNodes, (node).members); case SyntaxKind.TypeAliasDeclaration: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).name) || - child(cbNode, (node).type); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).type); case SyntaxKind.EnumDeclaration: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).name) || - children(cbNodes, (node).members); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNodes(cbNodes, (node).members); case SyntaxKind.EnumMember: - return child(cbNode, (node).name) || - child(cbNode, (node).initializer); + return visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).initializer); case SyntaxKind.ModuleDeclaration: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).name) || - child(cbNode, (node).body); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).body); case SyntaxKind.ImportDeclaration: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).name) || - child(cbNode, (node).moduleReference); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).moduleReference); case SyntaxKind.ExportAssignment: - return children(cbNodes, node.modifiers) || - child(cbNode, (node).exportName); + return visitNodes(cbNodes, node.modifiers) || + visitNode(cbNode, (node).exportName); case SyntaxKind.TemplateExpression: - return child(cbNode, (node).head) || children(cbNodes, (node).templateSpans); + return visitNode(cbNode, (node).head) || visitNodes(cbNodes, (node).templateSpans); case SyntaxKind.TemplateSpan: - return child(cbNode, (node).expression) || child(cbNode, (node).literal); + return visitNode(cbNode, (node).expression) || visitNode(cbNode, (node).literal); case SyntaxKind.ComputedPropertyName: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); case SyntaxKind.HeritageClause: - return children(cbNodes, (node).types); + return visitNodes(cbNodes, (node).types); case SyntaxKind.ExternalModuleReference: - return child(cbNode, (node).expression); + return visitNode(cbNode, (node).expression); } }