From f0ea98f5b2a00957ed8dfcbd00fb8dc756d4f12b Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Thu, 30 Oct 2014 13:57:40 -0700 Subject: [PATCH] Improve walking speed in Fidelity. --- src/services/formatting/formatter.ts | 2 +- .../formatting/indentationTrackingWalker.ts | 26 +- src/services/syntax/depthLimitedWalker.ts | 30 +- src/services/syntax/syntaxGenerator.ts | 86 +++--- src/services/syntax/syntaxWalker.generated.ts | 257 ++++++++---------- 5 files changed, 195 insertions(+), 206 deletions(-) diff --git a/src/services/formatting/formatter.ts b/src/services/formatting/formatter.ts index e4a1229abef..a98d969c059 100644 --- a/src/services/formatting/formatter.ts +++ b/src/services/formatting/formatter.ts @@ -52,7 +52,7 @@ module TypeScript.Services.Formatting { rulesProvider: RulesProvider, formattingRequestKind: FormattingRequestKind): TextEditInfo[] { var walker = new Formatter(textSpan, sourceUnit, indentFirstToken, options, snapshot, rulesProvider, formattingRequestKind); - visitNodeOrToken(walker, sourceUnit); + walker.walk(sourceUnit); return walker.edits(); } diff --git a/src/services/formatting/indentationTrackingWalker.ts b/src/services/formatting/indentationTrackingWalker.ts index b07b477623e..9e9c9e43a64 100644 --- a/src/services/formatting/indentationTrackingWalker.ts +++ b/src/services/formatting/indentationTrackingWalker.ts @@ -16,7 +16,7 @@ /// module TypeScript.Services.Formatting { - export class IndentationTrackingWalker extends SyntaxWalker { + export class IndentationTrackingWalker /*extends SyntaxWalker*/ { private _position: number = 0; private _parent: IndentationNodeContext = null; private _textSpan: TextSpan; @@ -26,7 +26,7 @@ module TypeScript.Services.Formatting { private _text: ISimpleText; constructor(textSpan: TextSpan, sourceUnit: SourceUnitSyntax, snapshot: ITextSnapshot, indentFirstToken: boolean, public options: FormattingOptions) { - super(); + // super(); // Create a pool object to manage context nodes while walking the tree this._indentationNodeContextPool = new IndentationNodeContextPool(); @@ -100,7 +100,23 @@ module TypeScript.Services.Formatting { this._position += token.fullWidth(); } - public visitNode(node: ISyntaxNode): void { + public walk(element: ISyntaxElement) { + if (element && !isShared(element)) { + if (isToken(element)) { + this.visitToken(element); + } + else if (element.kind() === SyntaxKind.List || element.kind() === SyntaxKind.SeparatedList) { + for (var i = 0, n = childCount(element); i < n; i++) { + this.walk(childAt(element, i)); + } + } + else { + this.visitNode(element); + } + } + } + + private visitNode(node: ISyntaxNode): void { var nodeSpan = new TextSpan(this._position, fullWidth(node)); if (nodeSpan.intersectsWithTextSpan(this._textSpan)) { @@ -112,7 +128,9 @@ module TypeScript.Services.Formatting { this._parent = this._indentationNodeContextPool.getNode(currentParent, node, this._position, indentation.indentationAmount, indentation.indentationAmountDelta); // Visit node - visitNodeOrToken(this, node); + for (var i = 0, n = childCount(node); i < n; i++) { + this.walk(childAt(node, i)); + } // Reset state this._indentationNodeContextPool.releaseNode(this._parent); diff --git a/src/services/syntax/depthLimitedWalker.ts b/src/services/syntax/depthLimitedWalker.ts index 79df1ebd836..c697ed42495 100644 --- a/src/services/syntax/depthLimitedWalker.ts +++ b/src/services/syntax/depthLimitedWalker.ts @@ -1,21 +1,21 @@ /// module TypeScript { - export class DepthLimitedWalker extends SyntaxWalker { - private _depth: number = 0; - private _maximumDepth: number = 0; + //export class DepthLimitedWalker extends SyntaxWalker { + // private _depth: number = 0; + // private _maximumDepth: number = 0; - constructor(maximumDepth: number) { - super(); - this._maximumDepth = maximumDepth; - } + // constructor(maximumDepth: number) { + // super(); + // this._maximumDepth = maximumDepth; + // } - public visitNode(node: ISyntaxNode): void { - if (this._depth < this._maximumDepth) { - this._depth++; - super.visitNode(node); - this._depth--; - } - } - } + // public visitNode(node: ISyntaxNode): void { + // if (this._depth < this._maximumDepth) { + // this._depth++; + // super.visitNode(node); + // this._depth--; + // } + // } + //} } \ No newline at end of file diff --git a/src/services/syntax/syntaxGenerator.ts b/src/services/syntax/syntaxGenerator.ts index b6b3e51ecff..5c28954a1c2 100644 --- a/src/services/syntax/syntaxGenerator.ts +++ b/src/services/syntax/syntaxGenerator.ts @@ -2311,19 +2311,19 @@ function generateWalker(): string { " export class SyntaxWalker implements ISyntaxVisitor {\r\n" + " public visitToken(token: ISyntaxToken): void {\r\n" + " }\r\n" + -"\r\n" + -" public visitNode(node: ISyntaxNode): void {\r\n" + -" visitNodeOrToken(this, node);\r\n" + -" }\r\n" + -"\r\n" + -" public visitNodeOrToken(nodeOrToken: ISyntaxNodeOrToken): void {\r\n" + -" if (isToken(nodeOrToken)) { \r\n" + -" this.visitToken(nodeOrToken);\r\n" + -" }\r\n" + -" else {\r\n" + -" this.visitNode(nodeOrToken);\r\n" + -" }\r\n" + -" }\r\n" + +//"\r\n" + +//" public visitNode(node: ISyntaxNode): void {\r\n" + +//" visitNodeOrToken(this, node);\r\n" + +//" }\r\n" + +//"\r\n" + +//" public visitNodeOrToken(nodeOrToken: ISyntaxNodeOrToken): void {\r\n" + +//" if (isToken(nodeOrToken)) { \r\n" + +//" this.visitToken(nodeOrToken);\r\n" + +//" }\r\n" + +//" else {\r\n" + +//" this.visitNode(nodeOrToken);\r\n" + +//" }\r\n" + +//" }\r\n" + "\r\n" + " private visitOptionalToken(token: ISyntaxToken): void {\r\n" + " if (token === undefined) {\r\n" + @@ -2332,33 +2332,33 @@ function generateWalker(): string { "\r\n" + " this.visitToken(token);\r\n" + " }\r\n" + -"\r\n" + -" public visitOptionalNode(node: ISyntaxNode): void {\r\n" + -" if (node === undefined) {\r\n" + -" return;\r\n" + -" }\r\n" + -"\r\n" + -" this.visitNode(node);\r\n" + -" }\r\n" + -"\r\n" + -" public visitOptionalNodeOrToken(nodeOrToken: ISyntaxNodeOrToken): void {\r\n" + -" if (nodeOrToken === undefined) {\r\n" + -" return;\r\n" + -" }\r\n" + -"\r\n" + -" this.visitNodeOrToken(nodeOrToken);\r\n" + -" }\r\n" + +//"\r\n" + +//" public visitOptionalNode(node: ISyntaxNode): void {\r\n" + +//" if (node === undefined) {\r\n" + +//" return;\r\n" + +//" }\r\n" + +//"\r\n" + +//" this.visitNode(node);\r\n" + +//" }\r\n" + +//"\r\n" + +//" public visitOptionalNodeOrToken(nodeOrToken: ISyntaxNodeOrToken): void {\r\n" + +//" if (nodeOrToken === undefined) {\r\n" + +//" return;\r\n" + +//" }\r\n" + +//"\r\n" + +//" this.visitNodeOrToken(nodeOrToken);\r\n" + +//" }\r\n" + "\r\n" + " public visitList(list: ISyntaxNodeOrToken[]): void {\r\n" + " for (var i = 0, n = list.length; i < n; i++) {\r\n" + -" this.visitNodeOrToken(list[i]);\r\n" + +" visitNodeOrToken(this, list[i]);\r\n" + " }\r\n" + " }\r\n" + "\r\n" + " public visitSeparatedList(list: ISyntaxNodeOrToken[]): void {\r\n" + " for (var i = 0, n = childCount(list); i < n; i++) {\r\n" + " var item = childAt(list, i);\r\n" + -" this.visitNodeOrToken(item);\r\n" + +" visitNodeOrToken(this, item);\r\n" + " }\r\n" + " }\r\n"; @@ -2386,20 +2386,20 @@ function generateWalker(): string { result += " this.visitSeparatedList(node." + child.name + ");\r\n"; } else if (isNodeOrToken(child)) { - if (child.isOptional) { - result += " this.visitOptionalNodeOrToken(node." + child.name + ");\r\n"; - } - else { - result += " this.visitNodeOrToken(node." + child.name + ");\r\n"; - } + //if (child.isOptional) { + result += " visitNodeOrToken(this, node." + child.name + ");\r\n"; + //} + //else { + // result += " this.visitNodeOrToken(node." + child.name + ");\r\n"; + //} } else if (child.type !== "SyntaxKind") { - if (child.isOptional) { - result += " this.visitOptionalNode(node." + child.name + ");\r\n"; - } - else { - result += " this.visitNode(node." + child.name + ");\r\n"; - } + //if (child.isOptional) { + result += " visitNodeOrToken(this, node." + child.name + ");\r\n"; + //} + //else { + // result += " this.visitNode(node." + child.name + ");\r\n"; + //} } } diff --git a/src/services/syntax/syntaxWalker.generated.ts b/src/services/syntax/syntaxWalker.generated.ts index fe43bd25b18..21c1acefc7f 100644 --- a/src/services/syntax/syntaxWalker.generated.ts +++ b/src/services/syntax/syntaxWalker.generated.ts @@ -5,19 +5,6 @@ module TypeScript { public visitToken(token: ISyntaxToken): void { } - public visitNode(node: ISyntaxNode): void { - visitNodeOrToken(this, node); - } - - public visitNodeOrToken(nodeOrToken: ISyntaxNodeOrToken): void { - if (isToken(nodeOrToken)) { - this.visitToken(nodeOrToken); - } - else { - this.visitNode(nodeOrToken); - } - } - private visitOptionalToken(token: ISyntaxToken): void { if (token === undefined) { return; @@ -26,32 +13,16 @@ module TypeScript { this.visitToken(token); } - public visitOptionalNode(node: ISyntaxNode): void { - if (node === undefined) { - return; - } - - this.visitNode(node); - } - - public visitOptionalNodeOrToken(nodeOrToken: ISyntaxNodeOrToken): void { - if (nodeOrToken === undefined) { - return; - } - - this.visitNodeOrToken(nodeOrToken); - } - public visitList(list: ISyntaxNodeOrToken[]): void { for (var i = 0, n = list.length; i < n; i++) { - this.visitNodeOrToken(list[i]); + visitNodeOrToken(this, list[i]); } } public visitSeparatedList(list: ISyntaxNodeOrToken[]): void { for (var i = 0, n = childCount(list); i < n; i++) { var item = childAt(list, i); - this.visitNodeOrToken(item); + visitNodeOrToken(this, item); } } @@ -61,7 +32,7 @@ module TypeScript { } public visitQualifiedName(node: QualifiedNameSyntax): void { - this.visitNodeOrToken(node.left); + visitNodeOrToken(this, node.left); this.visitToken(node.dotToken); this.visitToken(node.right); } @@ -73,34 +44,34 @@ module TypeScript { } public visitFunctionType(node: FunctionTypeSyntax): void { - this.visitOptionalNode(node.typeParameterList); - this.visitNode(node.parameterList); + visitNodeOrToken(this, node.typeParameterList); + visitNodeOrToken(this, node.parameterList); this.visitToken(node.equalsGreaterThanToken); - this.visitNodeOrToken(node.type); + visitNodeOrToken(this, node.type); } public visitArrayType(node: ArrayTypeSyntax): void { - this.visitNodeOrToken(node.type); + visitNodeOrToken(this, node.type); this.visitToken(node.openBracketToken); this.visitToken(node.closeBracketToken); } public visitConstructorType(node: ConstructorTypeSyntax): void { this.visitToken(node.newKeyword); - this.visitOptionalNode(node.typeParameterList); - this.visitNode(node.parameterList); + visitNodeOrToken(this, node.typeParameterList); + visitNodeOrToken(this, node.parameterList); this.visitToken(node.equalsGreaterThanToken); - this.visitNodeOrToken(node.type); + visitNodeOrToken(this, node.type); } public visitGenericType(node: GenericTypeSyntax): void { - this.visitNodeOrToken(node.name); - this.visitNode(node.typeArgumentList); + visitNodeOrToken(this, node.name); + visitNodeOrToken(this, node.typeArgumentList); } public visitTypeQuery(node: TypeQuerySyntax): void { this.visitToken(node.typeOfKeyword); - this.visitNodeOrToken(node.name); + visitNodeOrToken(this, node.name); } public visitTupleType(node: TupleTypeSyntax): void { @@ -110,14 +81,14 @@ module TypeScript { } public visitUnionType(node: UnionTypeSyntax): void { - this.visitNodeOrToken(node.left); + visitNodeOrToken(this, node.left); this.visitToken(node.barToken); - this.visitNodeOrToken(node.right); + visitNodeOrToken(this, node.right); } public visitParenthesizedType(node: ParenthesizedTypeSyntax): void { this.visitToken(node.openParenToken); - this.visitNodeOrToken(node.type); + visitNodeOrToken(this, node.type); this.visitToken(node.closeParenToken); } @@ -125,24 +96,24 @@ module TypeScript { this.visitList(node.modifiers); this.visitToken(node.interfaceKeyword); this.visitToken(node.identifier); - this.visitOptionalNode(node.typeParameterList); + visitNodeOrToken(this, node.typeParameterList); this.visitList(node.heritageClauses); - this.visitNode(node.body); + visitNodeOrToken(this, node.body); } public visitFunctionDeclaration(node: FunctionDeclarationSyntax): void { this.visitList(node.modifiers); this.visitToken(node.functionKeyword); this.visitToken(node.identifier); - this.visitNode(node.callSignature); - this.visitOptionalNode(node.block); + visitNodeOrToken(this, node.callSignature); + visitNodeOrToken(this, node.block); this.visitOptionalToken(node.semicolonToken); } public visitModuleDeclaration(node: ModuleDeclarationSyntax): void { this.visitList(node.modifiers); this.visitToken(node.moduleKeyword); - this.visitOptionalNodeOrToken(node.name); + visitNodeOrToken(this, node.name); this.visitOptionalToken(node.stringLiteral); this.visitToken(node.openBraceToken); this.visitList(node.moduleElements); @@ -153,7 +124,7 @@ module TypeScript { this.visitList(node.modifiers); this.visitToken(node.classKeyword); this.visitToken(node.identifier); - this.visitOptionalNode(node.typeParameterList); + visitNodeOrToken(this, node.typeParameterList); this.visitList(node.heritageClauses); this.visitToken(node.openBraceToken); this.visitList(node.classElements); @@ -174,7 +145,7 @@ module TypeScript { this.visitToken(node.importKeyword); this.visitToken(node.identifier); this.visitToken(node.equalsToken); - this.visitNodeOrToken(node.moduleReference); + visitNodeOrToken(this, node.moduleReference); this.visitOptionalToken(node.semicolonToken); } @@ -188,28 +159,28 @@ module TypeScript { public visitMemberFunctionDeclaration(node: MemberFunctionDeclarationSyntax): void { this.visitList(node.modifiers); this.visitToken(node.propertyName); - this.visitNode(node.callSignature); - this.visitOptionalNode(node.block); + visitNodeOrToken(this, node.callSignature); + visitNodeOrToken(this, node.block); this.visitOptionalToken(node.semicolonToken); } public visitMemberVariableDeclaration(node: MemberVariableDeclarationSyntax): void { this.visitList(node.modifiers); - this.visitNode(node.variableDeclarator); + visitNodeOrToken(this, node.variableDeclarator); this.visitOptionalToken(node.semicolonToken); } public visitConstructorDeclaration(node: ConstructorDeclarationSyntax): void { this.visitList(node.modifiers); this.visitToken(node.constructorKeyword); - this.visitNode(node.callSignature); - this.visitOptionalNode(node.block); + visitNodeOrToken(this, node.callSignature); + visitNodeOrToken(this, node.block); this.visitOptionalToken(node.semicolonToken); } public visitIndexMemberDeclaration(node: IndexMemberDeclarationSyntax): void { this.visitList(node.modifiers); - this.visitNode(node.indexSignature); + visitNodeOrToken(this, node.indexSignature); this.visitOptionalToken(node.semicolonToken); } @@ -217,46 +188,46 @@ module TypeScript { this.visitList(node.modifiers); this.visitToken(node.getKeyword); this.visitToken(node.propertyName); - this.visitNode(node.callSignature); - this.visitNode(node.block); + visitNodeOrToken(this, node.callSignature); + visitNodeOrToken(this, node.block); } public visitSetAccessor(node: SetAccessorSyntax): void { this.visitList(node.modifiers); this.visitToken(node.setKeyword); this.visitToken(node.propertyName); - this.visitNode(node.callSignature); - this.visitNode(node.block); + visitNodeOrToken(this, node.callSignature); + visitNodeOrToken(this, node.block); } public visitPropertySignature(node: PropertySignatureSyntax): void { this.visitToken(node.propertyName); this.visitOptionalToken(node.questionToken); - this.visitOptionalNode(node.typeAnnotation); + visitNodeOrToken(this, node.typeAnnotation); } public visitCallSignature(node: CallSignatureSyntax): void { - this.visitOptionalNode(node.typeParameterList); - this.visitNode(node.parameterList); - this.visitOptionalNode(node.typeAnnotation); + visitNodeOrToken(this, node.typeParameterList); + visitNodeOrToken(this, node.parameterList); + visitNodeOrToken(this, node.typeAnnotation); } public visitConstructSignature(node: ConstructSignatureSyntax): void { this.visitToken(node.newKeyword); - this.visitNode(node.callSignature); + visitNodeOrToken(this, node.callSignature); } public visitIndexSignature(node: IndexSignatureSyntax): void { this.visitToken(node.openBracketToken); this.visitSeparatedList(node.parameters); this.visitToken(node.closeBracketToken); - this.visitOptionalNode(node.typeAnnotation); + visitNodeOrToken(this, node.typeAnnotation); } public visitMethodSignature(node: MethodSignatureSyntax): void { this.visitToken(node.propertyName); this.visitOptionalToken(node.questionToken); - this.visitNode(node.callSignature); + visitNodeOrToken(this, node.callSignature); } public visitBlock(node: BlockSyntax): void { @@ -268,33 +239,33 @@ module TypeScript { public visitIfStatement(node: IfStatementSyntax): void { this.visitToken(node.ifKeyword); this.visitToken(node.openParenToken); - this.visitNodeOrToken(node.condition); + visitNodeOrToken(this, node.condition); this.visitToken(node.closeParenToken); - this.visitNodeOrToken(node.statement); - this.visitOptionalNode(node.elseClause); + visitNodeOrToken(this, node.statement); + visitNodeOrToken(this, node.elseClause); } public visitVariableStatement(node: VariableStatementSyntax): void { this.visitList(node.modifiers); - this.visitNode(node.variableDeclaration); + visitNodeOrToken(this, node.variableDeclaration); this.visitOptionalToken(node.semicolonToken); } public visitExpressionStatement(node: ExpressionStatementSyntax): void { - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitOptionalToken(node.semicolonToken); } public visitReturnStatement(node: ReturnStatementSyntax): void { this.visitToken(node.returnKeyword); - this.visitOptionalNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitOptionalToken(node.semicolonToken); } public visitSwitchStatement(node: SwitchStatementSyntax): void { this.visitToken(node.switchKeyword); this.visitToken(node.openParenToken); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitToken(node.closeParenToken); this.visitToken(node.openBraceToken); this.visitList(node.switchClauses); @@ -316,25 +287,25 @@ module TypeScript { public visitForStatement(node: ForStatementSyntax): void { this.visitToken(node.forKeyword); this.visitToken(node.openParenToken); - this.visitOptionalNode(node.variableDeclaration); - this.visitOptionalNodeOrToken(node.initializer); + visitNodeOrToken(this, node.variableDeclaration); + visitNodeOrToken(this, node.initializer); this.visitToken(node.firstSemicolonToken); - this.visitOptionalNodeOrToken(node.condition); + visitNodeOrToken(this, node.condition); this.visitToken(node.secondSemicolonToken); - this.visitOptionalNodeOrToken(node.incrementor); + visitNodeOrToken(this, node.incrementor); this.visitToken(node.closeParenToken); - this.visitNodeOrToken(node.statement); + visitNodeOrToken(this, node.statement); } public visitForInStatement(node: ForInStatementSyntax): void { this.visitToken(node.forKeyword); this.visitToken(node.openParenToken); - this.visitOptionalNode(node.variableDeclaration); - this.visitOptionalNodeOrToken(node.left); + visitNodeOrToken(this, node.variableDeclaration); + visitNodeOrToken(this, node.left); this.visitToken(node.inKeyword); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitToken(node.closeParenToken); - this.visitNodeOrToken(node.statement); + visitNodeOrToken(this, node.statement); } public visitEmptyStatement(node: EmptyStatementSyntax): void { @@ -343,37 +314,37 @@ module TypeScript { public visitThrowStatement(node: ThrowStatementSyntax): void { this.visitToken(node.throwKeyword); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitOptionalToken(node.semicolonToken); } public visitWhileStatement(node: WhileStatementSyntax): void { this.visitToken(node.whileKeyword); this.visitToken(node.openParenToken); - this.visitNodeOrToken(node.condition); + visitNodeOrToken(this, node.condition); this.visitToken(node.closeParenToken); - this.visitNodeOrToken(node.statement); + visitNodeOrToken(this, node.statement); } public visitTryStatement(node: TryStatementSyntax): void { this.visitToken(node.tryKeyword); - this.visitNode(node.block); - this.visitOptionalNode(node.catchClause); - this.visitOptionalNode(node.finallyClause); + visitNodeOrToken(this, node.block); + visitNodeOrToken(this, node.catchClause); + visitNodeOrToken(this, node.finallyClause); } public visitLabeledStatement(node: LabeledStatementSyntax): void { this.visitToken(node.identifier); this.visitToken(node.colonToken); - this.visitNodeOrToken(node.statement); + visitNodeOrToken(this, node.statement); } public visitDoStatement(node: DoStatementSyntax): void { this.visitToken(node.doKeyword); - this.visitNodeOrToken(node.statement); + visitNodeOrToken(this, node.statement); this.visitToken(node.whileKeyword); this.visitToken(node.openParenToken); - this.visitNodeOrToken(node.condition); + visitNodeOrToken(this, node.condition); this.visitToken(node.closeParenToken); this.visitOptionalToken(node.semicolonToken); } @@ -386,59 +357,59 @@ module TypeScript { public visitWithStatement(node: WithStatementSyntax): void { this.visitToken(node.withKeyword); this.visitToken(node.openParenToken); - this.visitNodeOrToken(node.condition); + visitNodeOrToken(this, node.condition); this.visitToken(node.closeParenToken); - this.visitNodeOrToken(node.statement); + visitNodeOrToken(this, node.statement); } public visitPrefixUnaryExpression(node: PrefixUnaryExpressionSyntax): void { this.visitToken(node.operatorToken); - this.visitNodeOrToken(node.operand); + visitNodeOrToken(this, node.operand); } public visitDeleteExpression(node: DeleteExpressionSyntax): void { this.visitToken(node.deleteKeyword); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); } public visitTypeOfExpression(node: TypeOfExpressionSyntax): void { this.visitToken(node.typeOfKeyword); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); } public visitVoidExpression(node: VoidExpressionSyntax): void { this.visitToken(node.voidKeyword); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); } public visitConditionalExpression(node: ConditionalExpressionSyntax): void { - this.visitNodeOrToken(node.condition); + visitNodeOrToken(this, node.condition); this.visitToken(node.questionToken); - this.visitNodeOrToken(node.whenTrue); + visitNodeOrToken(this, node.whenTrue); this.visitToken(node.colonToken); - this.visitNodeOrToken(node.whenFalse); + visitNodeOrToken(this, node.whenFalse); } public visitBinaryExpression(node: BinaryExpressionSyntax): void { - this.visitNodeOrToken(node.left); + visitNodeOrToken(this, node.left); this.visitToken(node.operatorToken); - this.visitNodeOrToken(node.right); + visitNodeOrToken(this, node.right); } public visitPostfixUnaryExpression(node: PostfixUnaryExpressionSyntax): void { - this.visitNodeOrToken(node.operand); + visitNodeOrToken(this, node.operand); this.visitToken(node.operatorToken); } public visitMemberAccessExpression(node: MemberAccessExpressionSyntax): void { - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitToken(node.dotToken); this.visitToken(node.name); } public visitInvocationExpression(node: InvocationExpressionSyntax): void { - this.visitNodeOrToken(node.expression); - this.visitNode(node.argumentList); + visitNodeOrToken(this, node.expression); + visitNodeOrToken(this, node.argumentList); } public visitArrayLiteralExpression(node: ArrayLiteralExpressionSyntax): void { @@ -455,49 +426,49 @@ module TypeScript { public visitObjectCreationExpression(node: ObjectCreationExpressionSyntax): void { this.visitToken(node.newKeyword); - this.visitNodeOrToken(node.expression); - this.visitOptionalNode(node.argumentList); + visitNodeOrToken(this, node.expression); + visitNodeOrToken(this, node.argumentList); } public visitParenthesizedExpression(node: ParenthesizedExpressionSyntax): void { this.visitToken(node.openParenToken); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitToken(node.closeParenToken); } public visitParenthesizedArrowFunctionExpression(node: ParenthesizedArrowFunctionExpressionSyntax): void { - this.visitNode(node.callSignature); + visitNodeOrToken(this, node.callSignature); this.visitToken(node.equalsGreaterThanToken); - this.visitOptionalNode(node.block); - this.visitOptionalNodeOrToken(node.expression); + visitNodeOrToken(this, node.block); + visitNodeOrToken(this, node.expression); } public visitSimpleArrowFunctionExpression(node: SimpleArrowFunctionExpressionSyntax): void { - this.visitNode(node.parameter); + visitNodeOrToken(this, node.parameter); this.visitToken(node.equalsGreaterThanToken); - this.visitOptionalNode(node.block); - this.visitOptionalNodeOrToken(node.expression); + visitNodeOrToken(this, node.block); + visitNodeOrToken(this, node.expression); } public visitCastExpression(node: CastExpressionSyntax): void { this.visitToken(node.lessThanToken); - this.visitNodeOrToken(node.type); + visitNodeOrToken(this, node.type); this.visitToken(node.greaterThanToken); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); } public visitElementAccessExpression(node: ElementAccessExpressionSyntax): void { - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitToken(node.openBracketToken); - this.visitNodeOrToken(node.argumentExpression); + visitNodeOrToken(this, node.argumentExpression); this.visitToken(node.closeBracketToken); } public visitFunctionExpression(node: FunctionExpressionSyntax): void { this.visitToken(node.functionKeyword); this.visitOptionalToken(node.identifier); - this.visitNode(node.callSignature); - this.visitNode(node.block); + visitNodeOrToken(this, node.callSignature); + visitNodeOrToken(this, node.block); } public visitOmittedExpression(node: OmittedExpressionSyntax): void { @@ -510,12 +481,12 @@ module TypeScript { public visitVariableDeclarator(node: VariableDeclaratorSyntax): void { this.visitToken(node.propertyName); - this.visitOptionalNode(node.typeAnnotation); - this.visitOptionalNode(node.equalsValueClause); + visitNodeOrToken(this, node.typeAnnotation); + visitNodeOrToken(this, node.equalsValueClause); } public visitArgumentList(node: ArgumentListSyntax): void { - this.visitOptionalNode(node.typeArgumentList); + visitNodeOrToken(this, node.typeArgumentList); this.visitToken(node.openParenToken); this.visitSeparatedList(node.arguments); this.visitToken(node.closeParenToken); @@ -546,12 +517,12 @@ module TypeScript { public visitEqualsValueClause(node: EqualsValueClauseSyntax): void { this.visitToken(node.equalsToken); - this.visitNodeOrToken(node.value); + visitNodeOrToken(this, node.value); } public visitCaseSwitchClause(node: CaseSwitchClauseSyntax): void { this.visitToken(node.caseKeyword); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); this.visitToken(node.colonToken); this.visitList(node.statements); } @@ -564,43 +535,43 @@ module TypeScript { public visitElseClause(node: ElseClauseSyntax): void { this.visitToken(node.elseKeyword); - this.visitNodeOrToken(node.statement); + visitNodeOrToken(this, node.statement); } public visitCatchClause(node: CatchClauseSyntax): void { this.visitToken(node.catchKeyword); this.visitToken(node.openParenToken); this.visitToken(node.identifier); - this.visitOptionalNode(node.typeAnnotation); + visitNodeOrToken(this, node.typeAnnotation); this.visitToken(node.closeParenToken); - this.visitNode(node.block); + visitNodeOrToken(this, node.block); } public visitFinallyClause(node: FinallyClauseSyntax): void { this.visitToken(node.finallyKeyword); - this.visitNode(node.block); + visitNodeOrToken(this, node.block); } public visitTypeParameter(node: TypeParameterSyntax): void { this.visitToken(node.identifier); - this.visitOptionalNode(node.constraint); + visitNodeOrToken(this, node.constraint); } public visitConstraint(node: ConstraintSyntax): void { this.visitToken(node.extendsKeyword); - this.visitNodeOrToken(node.typeOrExpression); + visitNodeOrToken(this, node.typeOrExpression); } public visitSimplePropertyAssignment(node: SimplePropertyAssignmentSyntax): void { this.visitToken(node.propertyName); this.visitToken(node.colonToken); - this.visitNodeOrToken(node.expression); + visitNodeOrToken(this, node.expression); } public visitFunctionPropertyAssignment(node: FunctionPropertyAssignmentSyntax): void { this.visitToken(node.propertyName); - this.visitNode(node.callSignature); - this.visitNode(node.block); + visitNodeOrToken(this, node.callSignature); + visitNodeOrToken(this, node.block); } public visitParameter(node: ParameterSyntax): void { @@ -608,18 +579,18 @@ module TypeScript { this.visitList(node.modifiers); this.visitToken(node.identifier); this.visitOptionalToken(node.questionToken); - this.visitOptionalNode(node.typeAnnotation); - this.visitOptionalNode(node.equalsValueClause); + visitNodeOrToken(this, node.typeAnnotation); + visitNodeOrToken(this, node.equalsValueClause); } public visitEnumElement(node: EnumElementSyntax): void { this.visitToken(node.propertyName); - this.visitOptionalNode(node.equalsValueClause); + visitNodeOrToken(this, node.equalsValueClause); } public visitTypeAnnotation(node: TypeAnnotationSyntax): void { this.visitToken(node.colonToken); - this.visitNodeOrToken(node.type); + visitNodeOrToken(this, node.type); } public visitExternalModuleReference(node: ExternalModuleReferenceSyntax): void { @@ -630,7 +601,7 @@ module TypeScript { } public visitModuleNameModuleReference(node: ModuleNameModuleReferenceSyntax): void { - this.visitNodeOrToken(node.moduleName); + visitNodeOrToken(this, node.moduleName); } } } \ No newline at end of file