diff --git a/src/Esprima/Ast/AccessorProperty.cs b/src/Esprima/Ast/AccessorProperty.cs index 2017cb2c..c077f155 100644 --- a/src/Esprima/Ast/AccessorProperty.cs +++ b/src/Esprima/Ast/AccessorProperty.cs @@ -28,7 +28,7 @@ public AccessorProperty( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt2(Decorators, Key, Value); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitAccessorProperty(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitAccessorProperty(this); public AccessorProperty UpdateWith(Expression key, Expression? value, in NodeList decorators) { diff --git a/src/Esprima/Ast/ArrayExpression.cs b/src/Esprima/Ast/ArrayExpression.cs index cd18cd12..0c8a8876 100644 --- a/src/Esprima/Ast/ArrayExpression.cs +++ b/src/Esprima/Ast/ArrayExpression.cs @@ -19,7 +19,7 @@ public ArrayExpression(in NodeList elements) : base(Nodes.ArrayExpr internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullable(Elements); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitArrayExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitArrayExpression(this); public ArrayExpression UpdateWith(in NodeList elements) { diff --git a/src/Esprima/Ast/ArrayPattern.cs b/src/Esprima/Ast/ArrayPattern.cs index 3100e9d8..f569babd 100644 --- a/src/Esprima/Ast/ArrayPattern.cs +++ b/src/Esprima/Ast/ArrayPattern.cs @@ -19,7 +19,7 @@ public ArrayPattern(in NodeList elements) : base(Nodes.ArrayPattern) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullable(Elements); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitArrayPattern(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitArrayPattern(this); public ArrayPattern UpdateWith(in NodeList elements) { diff --git a/src/Esprima/Ast/ArrowFunctionExpression.cs b/src/Esprima/Ast/ArrowFunctionExpression.cs index 2209eff2..edd012ea 100644 --- a/src/Esprima/Ast/ArrowFunctionExpression.cs +++ b/src/Esprima/Ast/ArrowFunctionExpression.cs @@ -38,7 +38,7 @@ public ArrowFunctionExpression( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Params, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitArrowFunctionExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitArrowFunctionExpression(this); public ArrowFunctionExpression UpdateWith(in NodeList parameters, StatementListItem body) { diff --git a/src/Esprima/Ast/ArrowParameterPlaceHolder.cs b/src/Esprima/Ast/ArrowParameterPlaceHolder.cs index fbf03ff3..01f61600 100644 --- a/src/Esprima/Ast/ArrowParameterPlaceHolder.cs +++ b/src/Esprima/Ast/ArrowParameterPlaceHolder.cs @@ -26,5 +26,5 @@ public ArrowParameterPlaceHolder( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Params); - protected internal override object? Accept(AstVisitor visitor) => throw new NotSupportedException(); + protected internal override T Accept(AstVisitor visitor) => throw new NotSupportedException(); } diff --git a/src/Esprima/Ast/AssignmentExpression.cs b/src/Esprima/Ast/AssignmentExpression.cs index aed02974..15ef8c99 100644 --- a/src/Esprima/Ast/AssignmentExpression.cs +++ b/src/Esprima/Ast/AssignmentExpression.cs @@ -102,7 +102,7 @@ public static string GetAssignmentOperatorToken(AssignmentOperator op) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Left, Right); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitAssignmentExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitAssignmentExpression(this); public AssignmentExpression UpdateWith(Node left, Expression right) { diff --git a/src/Esprima/Ast/AssignmentPattern.cs b/src/Esprima/Ast/AssignmentPattern.cs index 3a2de126..d544611b 100644 --- a/src/Esprima/Ast/AssignmentPattern.cs +++ b/src/Esprima/Ast/AssignmentPattern.cs @@ -21,7 +21,7 @@ public AssignmentPattern(Node left, Expression right) : base(Nodes.AssignmentPat internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Left, Right); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitAssignmentPattern(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitAssignmentPattern(this); public AssignmentPattern UpdateWith(Node left, Expression right) { diff --git a/src/Esprima/Ast/AwaitExpression.cs b/src/Esprima/Ast/AwaitExpression.cs index ae5cda49..5e65a027 100644 --- a/src/Esprima/Ast/AwaitExpression.cs +++ b/src/Esprima/Ast/AwaitExpression.cs @@ -14,7 +14,7 @@ public AwaitExpression(Expression argument) : base(Nodes.AwaitExpression) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Argument); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitAwaitExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitAwaitExpression(this); public AwaitExpression UpdateWith(Expression argument) { diff --git a/src/Esprima/Ast/BinaryExpression.cs b/src/Esprima/Ast/BinaryExpression.cs index fe34c2bb..15aa62a6 100644 --- a/src/Esprima/Ast/BinaryExpression.cs +++ b/src/Esprima/Ast/BinaryExpression.cs @@ -125,7 +125,7 @@ public static string GetBinaryOperatorToken(BinaryOperator op) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Left, Right); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitBinaryExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitBinaryExpression(this); protected virtual BinaryExpression Rewrite(Expression left, Expression right) { diff --git a/src/Esprima/Ast/BlockStatement.cs b/src/Esprima/Ast/BlockStatement.cs index 9dda3079..6c8264d5 100644 --- a/src/Esprima/Ast/BlockStatement.cs +++ b/src/Esprima/Ast/BlockStatement.cs @@ -16,7 +16,7 @@ public BlockStatement(in NodeList body) : base(Nodes.BlockStatement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitBlockStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitBlockStatement(this); public BlockStatement UpdateWith(in NodeList body) { diff --git a/src/Esprima/Ast/BreakStatement.cs b/src/Esprima/Ast/BreakStatement.cs index 37d4f948..a0b17318 100644 --- a/src/Esprima/Ast/BreakStatement.cs +++ b/src/Esprima/Ast/BreakStatement.cs @@ -14,7 +14,7 @@ public BreakStatement(Identifier? label) : base(Nodes.BreakStatement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullable(Label); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitBreakStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitBreakStatement(this); public BreakStatement UpdateWith(Identifier? label) { diff --git a/src/Esprima/Ast/CallExpression.cs b/src/Esprima/Ast/CallExpression.cs index 74c6455d..a660381d 100644 --- a/src/Esprima/Ast/CallExpression.cs +++ b/src/Esprima/Ast/CallExpression.cs @@ -23,7 +23,7 @@ public CallExpression( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Callee, Arguments); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitCallExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitCallExpression(this); public CallExpression UpdateWith(Expression callee, in NodeList arguments) { diff --git a/src/Esprima/Ast/CatchClause.cs b/src/Esprima/Ast/CatchClause.cs index eb6b2551..7a8e4547 100644 --- a/src/Esprima/Ast/CatchClause.cs +++ b/src/Esprima/Ast/CatchClause.cs @@ -20,7 +20,7 @@ public CatchClause(Node? param, BlockStatement body) : internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt0(Param, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitCatchClause(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitCatchClause(this); public CatchClause UpdateWith(Node? param, BlockStatement body) { diff --git a/src/Esprima/Ast/ChainExpression.cs b/src/Esprima/Ast/ChainExpression.cs index 660422b3..493b594b 100644 --- a/src/Esprima/Ast/ChainExpression.cs +++ b/src/Esprima/Ast/ChainExpression.cs @@ -17,7 +17,7 @@ public ChainExpression(Expression expression) : base(Nodes.ChainExpression) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Expression); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitChainExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitChainExpression(this); public ChainExpression UpdateWith(Expression expression) { diff --git a/src/Esprima/Ast/ClassBody.cs b/src/Esprima/Ast/ClassBody.cs index eaab6ced..c65a6381 100644 --- a/src/Esprima/Ast/ClassBody.cs +++ b/src/Esprima/Ast/ClassBody.cs @@ -19,7 +19,7 @@ public ClassBody(in NodeList body) : base(Nodes.ClassBody) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitClassBody(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitClassBody(this); public ClassBody UpdateWith(in NodeList body) { diff --git a/src/Esprima/Ast/ClassDeclaration.cs b/src/Esprima/Ast/ClassDeclaration.cs index d1364389..99ce7022 100644 --- a/src/Esprima/Ast/ClassDeclaration.cs +++ b/src/Esprima/Ast/ClassDeclaration.cs @@ -23,7 +23,7 @@ public ClassDeclaration(Identifier? id, Expression? superClass, ClassBody body, internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt1_2(Decorators, Id, SuperClass, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitClassDeclaration(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitClassDeclaration(this); public ClassDeclaration UpdateWith(Identifier? id, Expression? superClass, ClassBody body, in NodeList decorators) { diff --git a/src/Esprima/Ast/ClassExpression.cs b/src/Esprima/Ast/ClassExpression.cs index 1859a295..80608903 100644 --- a/src/Esprima/Ast/ClassExpression.cs +++ b/src/Esprima/Ast/ClassExpression.cs @@ -26,7 +26,7 @@ public ClassExpression( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt1_2(Decorators, Id, SuperClass, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitClassExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitClassExpression(this); public ClassExpression UpdateWith(Identifier? id, Expression? superClass, ClassBody body, in NodeList decorators) { diff --git a/src/Esprima/Ast/ConditionalExpression.cs b/src/Esprima/Ast/ConditionalExpression.cs index 016ffe24..4867fb6c 100644 --- a/src/Esprima/Ast/ConditionalExpression.cs +++ b/src/Esprima/Ast/ConditionalExpression.cs @@ -21,7 +21,7 @@ public ConditionalExpression( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Test, Consequent, Alternate); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitConditionalExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitConditionalExpression(this); public ConditionalExpression UpdateWith(Expression test, Expression consequent, Expression alternate) { diff --git a/src/Esprima/Ast/ContinueStatement.cs b/src/Esprima/Ast/ContinueStatement.cs index 8ad8878c..a36db689 100644 --- a/src/Esprima/Ast/ContinueStatement.cs +++ b/src/Esprima/Ast/ContinueStatement.cs @@ -14,7 +14,7 @@ public ContinueStatement(Identifier? label) : base(Nodes.ContinueStatement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullable(Label); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitContinueStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitContinueStatement(this); public ContinueStatement UpdateWith(Identifier? label) { diff --git a/src/Esprima/Ast/DebuggerStatement.cs b/src/Esprima/Ast/DebuggerStatement.cs index 084b62df..834af5aa 100644 --- a/src/Esprima/Ast/DebuggerStatement.cs +++ b/src/Esprima/Ast/DebuggerStatement.cs @@ -8,5 +8,5 @@ public DebuggerStatement() : base(Nodes.DebuggerStatement) { } internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitDebuggerStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitDebuggerStatement(this); } diff --git a/src/Esprima/Ast/Decorator.cs b/src/Esprima/Ast/Decorator.cs index 666239ad..0c4d0bef 100644 --- a/src/Esprima/Ast/Decorator.cs +++ b/src/Esprima/Ast/Decorator.cs @@ -14,7 +14,7 @@ public Decorator(Expression expression) : base(Nodes.Decorator) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Expression); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitDecorator(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitDecorator(this); public Decorator UpdateWith(Expression expression) { diff --git a/src/Esprima/Ast/DoWhileStatement.cs b/src/Esprima/Ast/DoWhileStatement.cs index 35ef61de..3fc297a7 100644 --- a/src/Esprima/Ast/DoWhileStatement.cs +++ b/src/Esprima/Ast/DoWhileStatement.cs @@ -16,7 +16,7 @@ public DoWhileStatement(Statement body, Expression test) : base(Nodes.DoWhileSta internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Body, Test); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitDoWhileStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitDoWhileStatement(this); public DoWhileStatement UpdateWith(Statement body, Expression test) { diff --git a/src/Esprima/Ast/EmptyStatement.cs b/src/Esprima/Ast/EmptyStatement.cs index d2f37245..22bf0ada 100644 --- a/src/Esprima/Ast/EmptyStatement.cs +++ b/src/Esprima/Ast/EmptyStatement.cs @@ -10,5 +10,5 @@ public EmptyStatement() : base(Nodes.EmptyStatement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitEmptyStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitEmptyStatement(this); } diff --git a/src/Esprima/Ast/ExportAllDeclaration.cs b/src/Esprima/Ast/ExportAllDeclaration.cs index 6439617a..680cc5a4 100644 --- a/src/Esprima/Ast/ExportAllDeclaration.cs +++ b/src/Esprima/Ast/ExportAllDeclaration.cs @@ -27,7 +27,7 @@ public ExportAllDeclaration(Literal source, Expression? exported, in NodeList enumerator.MoveNextNullableAt0(Exported, Source, Assertions); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitExportAllDeclaration(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitExportAllDeclaration(this); public ExportAllDeclaration UpdateWith(Expression? exported, Literal source, in NodeList assertions) { diff --git a/src/Esprima/Ast/ExportDefaultDeclaration.cs b/src/Esprima/Ast/ExportDefaultDeclaration.cs index b5faa73e..97ee1000 100644 --- a/src/Esprima/Ast/ExportDefaultDeclaration.cs +++ b/src/Esprima/Ast/ExportDefaultDeclaration.cs @@ -17,7 +17,7 @@ public ExportDefaultDeclaration(StatementListItem declaration) : base(Nodes.Expo internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Declaration); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitExportDefaultDeclaration(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitExportDefaultDeclaration(this); public ExportDefaultDeclaration UpdateWith(StatementListItem declaration) { diff --git a/src/Esprima/Ast/ExportNamedDeclaration.cs b/src/Esprima/Ast/ExportNamedDeclaration.cs index 8f1c45f4..acc96d4c 100644 --- a/src/Esprima/Ast/ExportNamedDeclaration.cs +++ b/src/Esprima/Ast/ExportNamedDeclaration.cs @@ -31,7 +31,7 @@ public ExportNamedDeclaration( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt0_2(Declaration, Specifiers, Source, Assertions); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitExportNamedDeclaration(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitExportNamedDeclaration(this); public ExportNamedDeclaration UpdateWith(Declaration? declaration, in NodeList specifiers, Literal? source, in NodeList assertions) { diff --git a/src/Esprima/Ast/ExportSpecifier.cs b/src/Esprima/Ast/ExportSpecifier.cs index f65789e5..91eb6bc5 100644 --- a/src/Esprima/Ast/ExportSpecifier.cs +++ b/src/Esprima/Ast/ExportSpecifier.cs @@ -22,7 +22,7 @@ public ExportSpecifier(Expression local, Expression exported) : base(Nodes.Expor internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextExportSpecifier(Local, Exported); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitExportSpecifier(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitExportSpecifier(this); public ExportSpecifier UpdateWith(Expression local, Expression exported) { diff --git a/src/Esprima/Ast/ExpressionStatement.cs b/src/Esprima/Ast/ExpressionStatement.cs index 887275e0..e82f5796 100644 --- a/src/Esprima/Ast/ExpressionStatement.cs +++ b/src/Esprima/Ast/ExpressionStatement.cs @@ -14,7 +14,7 @@ public ExpressionStatement(Expression expression) : base(Nodes.ExpressionStateme internal sealed override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Expression); - protected internal sealed override object? Accept(AstVisitor visitor) => visitor.VisitExpressionStatement(this); + protected internal sealed override T Accept(AstVisitor visitor) => visitor.VisitExpressionStatement(this); protected virtual ExpressionStatement Rewrite(Expression expression) { diff --git a/src/Esprima/Ast/ForInStatement.cs b/src/Esprima/Ast/ForInStatement.cs index 61e9e932..af45a309 100644 --- a/src/Esprima/Ast/ForInStatement.cs +++ b/src/Esprima/Ast/ForInStatement.cs @@ -24,7 +24,7 @@ public ForInStatement( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Left, Right, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitForInStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitForInStatement(this); public ForInStatement UpdateWith(Node left, Expression right, Statement body) { diff --git a/src/Esprima/Ast/ForOfStatement.cs b/src/Esprima/Ast/ForOfStatement.cs index b4727c1f..a1f95c61 100644 --- a/src/Esprima/Ast/ForOfStatement.cs +++ b/src/Esprima/Ast/ForOfStatement.cs @@ -27,7 +27,7 @@ public ForOfStatement( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Left, Right, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitForOfStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitForOfStatement(this); public ForOfStatement UpdateWith(Node left, Expression right, Statement body) { diff --git a/src/Esprima/Ast/ForStatement.cs b/src/Esprima/Ast/ForStatement.cs index d3dd2b14..c9724e39 100644 --- a/src/Esprima/Ast/ForStatement.cs +++ b/src/Esprima/Ast/ForStatement.cs @@ -28,7 +28,7 @@ public ForStatement( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt0_1_2(Init, Test, Update, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitForStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitForStatement(this); public ForStatement UpdateWith(StatementListItem? init, Expression? test, Expression? update, Statement body) { diff --git a/src/Esprima/Ast/FunctionDeclaration.cs b/src/Esprima/Ast/FunctionDeclaration.cs index 12b67d69..15fb76a4 100644 --- a/src/Esprima/Ast/FunctionDeclaration.cs +++ b/src/Esprima/Ast/FunctionDeclaration.cs @@ -40,7 +40,7 @@ public FunctionDeclaration( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt0(Id, Params, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitFunctionDeclaration(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitFunctionDeclaration(this); public FunctionDeclaration UpdateWith(Identifier? id, in NodeList parameters, BlockStatement body) { diff --git a/src/Esprima/Ast/FunctionExpression.cs b/src/Esprima/Ast/FunctionExpression.cs index 4ecbe5d8..0e0bd831 100644 --- a/src/Esprima/Ast/FunctionExpression.cs +++ b/src/Esprima/Ast/FunctionExpression.cs @@ -40,7 +40,7 @@ public FunctionExpression( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt0(Id, Params, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitFunctionExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitFunctionExpression(this); public FunctionExpression UpdateWith(Identifier? id, in NodeList parameters, BlockStatement body) { diff --git a/src/Esprima/Ast/Identifier.cs b/src/Esprima/Ast/Identifier.cs index b9d1b687..41c78313 100644 --- a/src/Esprima/Ast/Identifier.cs +++ b/src/Esprima/Ast/Identifier.cs @@ -14,5 +14,5 @@ public Identifier(string name) : base(Nodes.Identifier) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitIdentifier(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitIdentifier(this); } diff --git a/src/Esprima/Ast/IfStatement.cs b/src/Esprima/Ast/IfStatement.cs index 3b18a0c1..a3bdca07 100644 --- a/src/Esprima/Ast/IfStatement.cs +++ b/src/Esprima/Ast/IfStatement.cs @@ -22,7 +22,7 @@ public IfStatement( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt2(Test, Consequent, Alternate); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitIfStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitIfStatement(this); public IfStatement UpdateWith(Expression test, Statement consequent, Statement? alternate) { diff --git a/src/Esprima/Ast/Import.cs b/src/Esprima/Ast/Import.cs index 14745dd8..70ebbd87 100644 --- a/src/Esprima/Ast/Import.cs +++ b/src/Esprima/Ast/Import.cs @@ -20,7 +20,7 @@ public Import(Expression source, Expression? attributes) : base(Nodes.Import) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt1(Source, Attributes); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitImport(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitImport(this); public Import UpdateWith(Expression source, Expression? attributes) { diff --git a/src/Esprima/Ast/ImportAttribute.cs b/src/Esprima/Ast/ImportAttribute.cs index 95956995..e224aa28 100644 --- a/src/Esprima/Ast/ImportAttribute.cs +++ b/src/Esprima/Ast/ImportAttribute.cs @@ -19,7 +19,7 @@ public ImportAttribute(Expression key, Literal value) : base(Nodes.ImportAttribu internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Key, Value); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitImportAttribute(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitImportAttribute(this); public ImportAttribute UpdateWith(Expression key, Literal value) { diff --git a/src/Esprima/Ast/ImportDeclaration.cs b/src/Esprima/Ast/ImportDeclaration.cs index 294c60a8..a20799d0 100644 --- a/src/Esprima/Ast/ImportDeclaration.cs +++ b/src/Esprima/Ast/ImportDeclaration.cs @@ -25,7 +25,7 @@ public ImportDeclaration( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Specifiers, Source, Assertions); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitImportDeclaration(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitImportDeclaration(this); public ImportDeclaration UpdateWith(in NodeList specifiers, Literal source, in NodeList assertions) { diff --git a/src/Esprima/Ast/ImportDefaultSpecifier.cs b/src/Esprima/Ast/ImportDefaultSpecifier.cs index 3f676edb..c200d01e 100644 --- a/src/Esprima/Ast/ImportDefaultSpecifier.cs +++ b/src/Esprima/Ast/ImportDefaultSpecifier.cs @@ -10,7 +10,7 @@ public ImportDefaultSpecifier(Identifier local) : base(local, Nodes.ImportDefaul internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Local); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitImportDefaultSpecifier(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitImportDefaultSpecifier(this); public ImportDefaultSpecifier UpdateWith(Identifier local) { diff --git a/src/Esprima/Ast/ImportNamespaceSpecifier.cs b/src/Esprima/Ast/ImportNamespaceSpecifier.cs index 6551e409..93018971 100644 --- a/src/Esprima/Ast/ImportNamespaceSpecifier.cs +++ b/src/Esprima/Ast/ImportNamespaceSpecifier.cs @@ -10,7 +10,7 @@ public ImportNamespaceSpecifier(Identifier local) : base(local, Nodes.ImportName internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Local); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitImportNamespaceSpecifier(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitImportNamespaceSpecifier(this); public ImportNamespaceSpecifier UpdateWith(Identifier local) { diff --git a/src/Esprima/Ast/ImportSpecifier.cs b/src/Esprima/Ast/ImportSpecifier.cs index c668016d..7e73b737 100644 --- a/src/Esprima/Ast/ImportSpecifier.cs +++ b/src/Esprima/Ast/ImportSpecifier.cs @@ -17,7 +17,7 @@ public ImportSpecifier(Identifier local, Expression imported) : base(local, Node internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextImportSpecifier(Imported, Local); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitImportSpecifier(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitImportSpecifier(this); public ImportSpecifier UpdateWith(Expression imported, Identifier local) { diff --git a/src/Esprima/Ast/Jsx/JsxAttribute.cs b/src/Esprima/Ast/Jsx/JsxAttribute.cs index 837fd2b6..faa72599 100644 --- a/src/Esprima/Ast/Jsx/JsxAttribute.cs +++ b/src/Esprima/Ast/Jsx/JsxAttribute.cs @@ -16,7 +16,7 @@ public JsxAttribute(JsxExpression name, Expression? value) : base(JsxNodeType.At internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt1(Name, Value); - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxAttribute(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxAttribute(this); public JsxAttribute UpdateWith(JsxExpression name, Expression? value) { diff --git a/src/Esprima/Ast/Jsx/JsxClosingElement.cs b/src/Esprima/Ast/Jsx/JsxClosingElement.cs index 8dd79bbe..bf3a487b 100644 --- a/src/Esprima/Ast/Jsx/JsxClosingElement.cs +++ b/src/Esprima/Ast/Jsx/JsxClosingElement.cs @@ -14,7 +14,7 @@ public JsxClosingElement(JsxExpression name) : base(JsxNodeType.ClosingElement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Name); - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxClosingElement(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxClosingElement(this); public JsxClosingElement UpdateWith(JsxExpression name) { diff --git a/src/Esprima/Ast/Jsx/JsxClosingFragment.cs b/src/Esprima/Ast/Jsx/JsxClosingFragment.cs index 53cc3c01..66d7c67a 100644 --- a/src/Esprima/Ast/Jsx/JsxClosingFragment.cs +++ b/src/Esprima/Ast/Jsx/JsxClosingFragment.cs @@ -10,5 +10,5 @@ public JsxClosingFragment() : base(JsxNodeType.ClosingFragment) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxClosingFragment(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxClosingFragment(this); } diff --git a/src/Esprima/Ast/Jsx/JsxElement.cs b/src/Esprima/Ast/Jsx/JsxElement.cs index 0568ee27..6350a96d 100644 --- a/src/Esprima/Ast/Jsx/JsxElement.cs +++ b/src/Esprima/Ast/Jsx/JsxElement.cs @@ -20,7 +20,7 @@ public JsxElement(Node openingElement, in NodeList children, Node internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt2(OpeningElement, Children, ClosingElement); - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxElement(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxElement(this); public JsxElement UpdateWith(Node openingElement, in NodeList children, Node? closingElement) { diff --git a/src/Esprima/Ast/Jsx/JsxEmptyExpression.cs b/src/Esprima/Ast/Jsx/JsxEmptyExpression.cs index 17ebb4a0..6428ab1d 100644 --- a/src/Esprima/Ast/Jsx/JsxEmptyExpression.cs +++ b/src/Esprima/Ast/Jsx/JsxEmptyExpression.cs @@ -10,5 +10,5 @@ public JsxEmptyExpression() : base(JsxNodeType.EmptyExpression) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxEmptyExpression(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxEmptyExpression(this); } diff --git a/src/Esprima/Ast/Jsx/JsxExpression.cs b/src/Esprima/Ast/Jsx/JsxExpression.cs index 6288f69e..d5556674 100644 --- a/src/Esprima/Ast/Jsx/JsxExpression.cs +++ b/src/Esprima/Ast/Jsx/JsxExpression.cs @@ -16,11 +16,11 @@ protected JsxExpression(JsxNodeType type) : base(Nodes.Extension) public new JsxNodeType Type { [MethodImpl(MethodImplOptions.AggressiveInlining)] get; } - protected abstract object? Accept(IJsxAstVisitor visitor); + protected internal abstract T Accept(IJsxAstVisitor visitor); - protected internal sealed override object? Accept(AstVisitor visitor) + protected internal sealed override T Accept(AstVisitor visitor) { - return visitor is IJsxAstVisitor jsxVisitor ? Accept(jsxVisitor) : AcceptAsExtension(visitor); + return visitor is IJsxAstVisitor jsxVisitor ? Accept(jsxVisitor) : AcceptAsExtension(visitor); } private static readonly AstToJavaScriptOptions s_toStringOptions = JsxAstToJavaScriptOptions.Default with { IgnoreExtensions = true }; diff --git a/src/Esprima/Ast/Jsx/JsxExpressionContainer.cs b/src/Esprima/Ast/Jsx/JsxExpressionContainer.cs index 0cf6c60e..78b770d0 100644 --- a/src/Esprima/Ast/Jsx/JsxExpressionContainer.cs +++ b/src/Esprima/Ast/Jsx/JsxExpressionContainer.cs @@ -14,7 +14,7 @@ public JsxExpressionContainer(Expression expression) : base(JsxNodeType.Expressi internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Expression); - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxExpressionContainer(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxExpressionContainer(this); public JsxExpressionContainer UpdateWith(Expression expression) { diff --git a/src/Esprima/Ast/Jsx/JsxIdentifier.cs b/src/Esprima/Ast/Jsx/JsxIdentifier.cs index ba45316c..334cf3ce 100644 --- a/src/Esprima/Ast/Jsx/JsxIdentifier.cs +++ b/src/Esprima/Ast/Jsx/JsxIdentifier.cs @@ -16,5 +16,5 @@ public JsxIdentifier(string name) : base(JsxNodeType.Identifier) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxIdentifier(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxIdentifier(this); } diff --git a/src/Esprima/Ast/Jsx/JsxMemberExpression.cs b/src/Esprima/Ast/Jsx/JsxMemberExpression.cs index e6b9fca2..50054d36 100644 --- a/src/Esprima/Ast/Jsx/JsxMemberExpression.cs +++ b/src/Esprima/Ast/Jsx/JsxMemberExpression.cs @@ -16,7 +16,7 @@ public JsxMemberExpression(JsxExpression obj, JsxIdentifier property) : base(Jsx internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Object, Property); - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxMemberExpression(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxMemberExpression(this); public JsxMemberExpression UpdateWith(JsxExpression obj, JsxIdentifier property) { diff --git a/src/Esprima/Ast/Jsx/JsxNamespacedName.cs b/src/Esprima/Ast/Jsx/JsxNamespacedName.cs index 8cca76d6..7b45f9c6 100644 --- a/src/Esprima/Ast/Jsx/JsxNamespacedName.cs +++ b/src/Esprima/Ast/Jsx/JsxNamespacedName.cs @@ -18,7 +18,7 @@ public JsxNamespacedName(JsxIdentifier @namespace, JsxIdentifier name) : base(Js internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Name, Namespace); - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxNamespacedName(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxNamespacedName(this); public JsxNamespacedName UpdateWith(JsxIdentifier name, JsxIdentifier @namespace) { diff --git a/src/Esprima/Ast/Jsx/JsxOpeningElement.cs b/src/Esprima/Ast/Jsx/JsxOpeningElement.cs index 5750578f..95fdfa46 100644 --- a/src/Esprima/Ast/Jsx/JsxOpeningElement.cs +++ b/src/Esprima/Ast/Jsx/JsxOpeningElement.cs @@ -20,7 +20,7 @@ public JsxOpeningElement(JsxExpression name, bool selfClosing, in NodeList enumerator.MoveNext(Name, Attributes); - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxOpeningElement(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxOpeningElement(this); public JsxOpeningElement UpdateWith(JsxExpression name, in NodeList attributes) { diff --git a/src/Esprima/Ast/Jsx/JsxOpeningFragment.cs b/src/Esprima/Ast/Jsx/JsxOpeningFragment.cs index 0392c8c9..87153fa0 100644 --- a/src/Esprima/Ast/Jsx/JsxOpeningFragment.cs +++ b/src/Esprima/Ast/Jsx/JsxOpeningFragment.cs @@ -14,5 +14,5 @@ public JsxOpeningFragment(bool selfClosing) : base(JsxNodeType.OpeningFragment) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxOpeningFragment(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxOpeningFragment(this); } diff --git a/src/Esprima/Ast/Jsx/JsxSpreadAttribute.cs b/src/Esprima/Ast/Jsx/JsxSpreadAttribute.cs index c1e60af9..e2db6c74 100644 --- a/src/Esprima/Ast/Jsx/JsxSpreadAttribute.cs +++ b/src/Esprima/Ast/Jsx/JsxSpreadAttribute.cs @@ -14,7 +14,7 @@ public JsxSpreadAttribute(Expression argument) : base(JsxNodeType.SpreadAttribut internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Argument); - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxSpreadAttribute(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxSpreadAttribute(this); public JsxSpreadAttribute UpdateWith(Expression argument) { diff --git a/src/Esprima/Ast/Jsx/JsxText.cs b/src/Esprima/Ast/Jsx/JsxText.cs index 5a3271a9..6b5a9495 100644 --- a/src/Esprima/Ast/Jsx/JsxText.cs +++ b/src/Esprima/Ast/Jsx/JsxText.cs @@ -18,5 +18,5 @@ public JsxText(string? value, string raw) : base(JsxNodeType.Text) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected override object? Accept(IJsxAstVisitor visitor) => visitor.VisitJsxText(this); + protected internal override T Accept(IJsxAstVisitor visitor) => visitor.VisitJsxText(this); } diff --git a/src/Esprima/Ast/LabeledStatement.cs b/src/Esprima/Ast/LabeledStatement.cs index 132c2d6f..67f7e3f2 100644 --- a/src/Esprima/Ast/LabeledStatement.cs +++ b/src/Esprima/Ast/LabeledStatement.cs @@ -17,7 +17,7 @@ public LabeledStatement(Identifier label, Statement body) : base(Nodes.LabeledSt internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Label, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitLabeledStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitLabeledStatement(this); public LabeledStatement UpdateWith(Identifier label, Statement body) { diff --git a/src/Esprima/Ast/Literal.cs b/src/Esprima/Ast/Literal.cs index 799d6e28..9e823052 100644 --- a/src/Esprima/Ast/Literal.cs +++ b/src/Esprima/Ast/Literal.cs @@ -56,5 +56,5 @@ public Literal(string pattern, string flags, object? value, string raw) : this(T internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitLiteral(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitLiteral(this); } diff --git a/src/Esprima/Ast/MemberExpression.cs b/src/Esprima/Ast/MemberExpression.cs index 5d9f4760..f39c135b 100644 --- a/src/Esprima/Ast/MemberExpression.cs +++ b/src/Esprima/Ast/MemberExpression.cs @@ -24,7 +24,7 @@ protected MemberExpression(Expression obj, Expression property, bool computed, b internal sealed override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Object, Property); - protected internal sealed override object? Accept(AstVisitor visitor) => visitor.VisitMemberExpression(this); + protected internal sealed override T Accept(AstVisitor visitor) => visitor.VisitMemberExpression(this); protected abstract MemberExpression Rewrite(Expression obj, Expression property); diff --git a/src/Esprima/Ast/MetaProperty.cs b/src/Esprima/Ast/MetaProperty.cs index b5a053d6..d8b0dae7 100644 --- a/src/Esprima/Ast/MetaProperty.cs +++ b/src/Esprima/Ast/MetaProperty.cs @@ -16,7 +16,7 @@ public MetaProperty(Identifier meta, Identifier property) : base(Nodes.MetaPrope internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Meta, Property); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitMetaProperty(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitMetaProperty(this); public MetaProperty UpdateWith(Identifier meta, Identifier property) { diff --git a/src/Esprima/Ast/MethodDefinition.cs b/src/Esprima/Ast/MethodDefinition.cs index 09d8768c..0934758a 100644 --- a/src/Esprima/Ast/MethodDefinition.cs +++ b/src/Esprima/Ast/MethodDefinition.cs @@ -29,7 +29,7 @@ public MethodDefinition( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Decorators, Key, Value); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitMethodDefinition(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitMethodDefinition(this); public MethodDefinition UpdateWith(Expression key, FunctionExpression value, in NodeList decorators) { diff --git a/src/Esprima/Ast/NewExpression.cs b/src/Esprima/Ast/NewExpression.cs index ac8def58..003fffc7 100644 --- a/src/Esprima/Ast/NewExpression.cs +++ b/src/Esprima/Ast/NewExpression.cs @@ -21,7 +21,7 @@ public NewExpression( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Callee, Arguments); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitNewExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitNewExpression(this); public NewExpression UpdateWith(Expression callee, in NodeList arguments) { diff --git a/src/Esprima/Ast/Node.cs b/src/Esprima/Ast/Node.cs index 365f37dd..7072b085 100644 --- a/src/Esprima/Ast/Node.cs +++ b/src/Esprima/Ast/Node.cs @@ -25,16 +25,16 @@ protected Node(Nodes type) internal virtual Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => throw new NotImplementedException($"User-defined node types should override the {nameof(GetChildNodes)} method and provide an actual implementation."); - protected internal abstract object? Accept(AstVisitor visitor); + protected internal abstract T Accept(AstVisitor visitor); /// /// Dispatches the visitation of the current node to . /// /// - /// When defining custom node types, inheritors can use this method to implement the abstract method. + /// When defining custom node types, inheritors can use this method to implement the abstract method. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - protected object? AcceptAsExtension(AstVisitor visitor) + protected T AcceptAsExtension(AstVisitor visitor) { return visitor.VisitExtension(this); } diff --git a/src/Esprima/Ast/ObjectExpression.cs b/src/Esprima/Ast/ObjectExpression.cs index f36bb321..29b515ae 100644 --- a/src/Esprima/Ast/ObjectExpression.cs +++ b/src/Esprima/Ast/ObjectExpression.cs @@ -19,7 +19,7 @@ public ObjectExpression(in NodeList properties) : base(Nodes.ObjectExpress internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Properties); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitObjectExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitObjectExpression(this); public ObjectExpression UpdateWith(in NodeList properties) { diff --git a/src/Esprima/Ast/ObjectPattern.cs b/src/Esprima/Ast/ObjectPattern.cs index 931c9b5a..69b16133 100644 --- a/src/Esprima/Ast/ObjectPattern.cs +++ b/src/Esprima/Ast/ObjectPattern.cs @@ -19,7 +19,7 @@ public ObjectPattern(in NodeList properties) : base(Nodes.ObjectPattern) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Properties); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitObjectPattern(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitObjectPattern(this); public ObjectPattern UpdateWith(in NodeList properties) { diff --git a/src/Esprima/Ast/PrivateIdentifier.cs b/src/Esprima/Ast/PrivateIdentifier.cs index f332f563..f5554608 100644 --- a/src/Esprima/Ast/PrivateIdentifier.cs +++ b/src/Esprima/Ast/PrivateIdentifier.cs @@ -14,5 +14,5 @@ public PrivateIdentifier(string name) : base(Nodes.PrivateIdentifier) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitPrivateIdentifier(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitPrivateIdentifier(this); } diff --git a/src/Esprima/Ast/Program.cs b/src/Esprima/Ast/Program.cs index 3d4ef743..3aa5264f 100644 --- a/src/Esprima/Ast/Program.cs +++ b/src/Esprima/Ast/Program.cs @@ -49,7 +49,7 @@ public IReadOnlyList? Comments internal sealed override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Body); - protected internal sealed override object? Accept(AstVisitor visitor) => visitor.VisitProgram(this); + protected internal sealed override T Accept(AstVisitor visitor) => visitor.VisitProgram(this); protected abstract Program Rewrite(in NodeList body); diff --git a/src/Esprima/Ast/Property.cs b/src/Esprima/Ast/Property.cs index 5de07c2d..3c6a4c50 100644 --- a/src/Esprima/Ast/Property.cs +++ b/src/Esprima/Ast/Property.cs @@ -43,7 +43,7 @@ public Property( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextProperty(Key, Value, Shorthand); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitProperty(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitProperty(this); public Property UpdateWith(Expression key, Node value) { diff --git a/src/Esprima/Ast/PropertyDefinition.cs b/src/Esprima/Ast/PropertyDefinition.cs index 6ba8e3fd..a52145d9 100644 --- a/src/Esprima/Ast/PropertyDefinition.cs +++ b/src/Esprima/Ast/PropertyDefinition.cs @@ -28,7 +28,7 @@ public PropertyDefinition( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt2(Decorators, Key, Value); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitPropertyDefinition(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitPropertyDefinition(this); public PropertyDefinition UpdateWith(Expression key, Expression? value, in NodeList decorators) { diff --git a/src/Esprima/Ast/RestElement.cs b/src/Esprima/Ast/RestElement.cs index 60e10ba4..ec046d4c 100644 --- a/src/Esprima/Ast/RestElement.cs +++ b/src/Esprima/Ast/RestElement.cs @@ -17,7 +17,7 @@ public RestElement(Node argument) : base(Nodes.RestElement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Argument); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitRestElement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitRestElement(this); public RestElement UpdateWith(Node argument) { diff --git a/src/Esprima/Ast/ReturnStatement.cs b/src/Esprima/Ast/ReturnStatement.cs index 76947353..f01a1d16 100644 --- a/src/Esprima/Ast/ReturnStatement.cs +++ b/src/Esprima/Ast/ReturnStatement.cs @@ -14,7 +14,7 @@ public ReturnStatement(Expression? argument) : base(Nodes.ReturnStatement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullable(Argument); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitReturnStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitReturnStatement(this); public ReturnStatement UpdateWith(Expression? argument) { diff --git a/src/Esprima/Ast/SequenceExpression.cs b/src/Esprima/Ast/SequenceExpression.cs index 6976469a..6bd9aed8 100644 --- a/src/Esprima/Ast/SequenceExpression.cs +++ b/src/Esprima/Ast/SequenceExpression.cs @@ -16,7 +16,7 @@ public SequenceExpression(in NodeList expressions) : base(Nodes.Sequ internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Expressions); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitSequenceExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitSequenceExpression(this); public SequenceExpression UpdateWith(in NodeList expressions) { diff --git a/src/Esprima/Ast/SpreadElement.cs b/src/Esprima/Ast/SpreadElement.cs index de785e61..7c615453 100644 --- a/src/Esprima/Ast/SpreadElement.cs +++ b/src/Esprima/Ast/SpreadElement.cs @@ -14,7 +14,7 @@ public SpreadElement(Expression argument) : base(Nodes.SpreadElement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Argument); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitSpreadElement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitSpreadElement(this); public SpreadElement UpdateWith(Expression argument) { diff --git a/src/Esprima/Ast/StaticBlock.cs b/src/Esprima/Ast/StaticBlock.cs index f5835cbc..8b6fa3de 100644 --- a/src/Esprima/Ast/StaticBlock.cs +++ b/src/Esprima/Ast/StaticBlock.cs @@ -16,7 +16,7 @@ public StaticBlock(in NodeList body) : base(Nodes.StaticBlock) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitStaticBlock(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitStaticBlock(this); public StaticBlock UpdateWith(in NodeList body) { diff --git a/src/Esprima/Ast/Super.cs b/src/Esprima/Ast/Super.cs index 106e4d6b..050209ea 100644 --- a/src/Esprima/Ast/Super.cs +++ b/src/Esprima/Ast/Super.cs @@ -10,5 +10,5 @@ public Super() : base(Nodes.Super) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitSuper(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitSuper(this); } diff --git a/src/Esprima/Ast/SwitchCase.cs b/src/Esprima/Ast/SwitchCase.cs index 628852b5..2f31d6c4 100644 --- a/src/Esprima/Ast/SwitchCase.cs +++ b/src/Esprima/Ast/SwitchCase.cs @@ -18,7 +18,7 @@ public SwitchCase(Expression? test, in NodeList consequent) : base(No internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt0(Test, Consequent); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitSwitchCase(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitSwitchCase(this); public SwitchCase UpdateWith(Expression? test, in NodeList consequent) { diff --git a/src/Esprima/Ast/SwitchStatement.cs b/src/Esprima/Ast/SwitchStatement.cs index 36e54b3f..3f061ff5 100644 --- a/src/Esprima/Ast/SwitchStatement.cs +++ b/src/Esprima/Ast/SwitchStatement.cs @@ -18,7 +18,7 @@ public SwitchStatement(Expression discriminant, in NodeList cases) : internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Discriminant, Cases); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitSwitchStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitSwitchStatement(this); public SwitchStatement UpdateWith(Expression discriminant, in NodeList cases) { diff --git a/src/Esprima/Ast/TaggedTemplateExpression.cs b/src/Esprima/Ast/TaggedTemplateExpression.cs index 2f86d26d..8b0fcd5f 100644 --- a/src/Esprima/Ast/TaggedTemplateExpression.cs +++ b/src/Esprima/Ast/TaggedTemplateExpression.cs @@ -16,7 +16,7 @@ public TaggedTemplateExpression(Expression tag, TemplateLiteral quasi) : base(No internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Tag, Quasi); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitTaggedTemplateExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitTaggedTemplateExpression(this); public TaggedTemplateExpression UpdateWith(Expression tag, TemplateLiteral quasi) { diff --git a/src/Esprima/Ast/TemplateElement.cs b/src/Esprima/Ast/TemplateElement.cs index e09e74d1..1a494789 100644 --- a/src/Esprima/Ast/TemplateElement.cs +++ b/src/Esprima/Ast/TemplateElement.cs @@ -18,5 +18,5 @@ public sealed record TemplateElementValue(string? Cooked, string Raw); internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitTemplateElement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitTemplateElement(this); } diff --git a/src/Esprima/Ast/TemplateLiteral.cs b/src/Esprima/Ast/TemplateLiteral.cs index f39cc69d..8f5dc145 100644 --- a/src/Esprima/Ast/TemplateLiteral.cs +++ b/src/Esprima/Ast/TemplateLiteral.cs @@ -22,7 +22,7 @@ public TemplateLiteral( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextTemplateLiteral(Quasis, Expressions); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitTemplateLiteral(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitTemplateLiteral(this); public TemplateLiteral UpdateWith(in NodeList quasis, in NodeList expressions) { diff --git a/src/Esprima/Ast/ThisExpression.cs b/src/Esprima/Ast/ThisExpression.cs index 60c26c88..83a4b848 100644 --- a/src/Esprima/Ast/ThisExpression.cs +++ b/src/Esprima/Ast/ThisExpression.cs @@ -10,5 +10,5 @@ public ThisExpression() : base(Nodes.ThisExpression) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitThisExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitThisExpression(this); } diff --git a/src/Esprima/Ast/ThrowStatement.cs b/src/Esprima/Ast/ThrowStatement.cs index 65f4cff2..d88cae6e 100644 --- a/src/Esprima/Ast/ThrowStatement.cs +++ b/src/Esprima/Ast/ThrowStatement.cs @@ -14,7 +14,7 @@ public ThrowStatement(Expression argument) : base(Nodes.ThrowStatement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Argument); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitThrowStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitThrowStatement(this); public ThrowStatement UpdateWith(Expression argument) { diff --git a/src/Esprima/Ast/TryStatement.cs b/src/Esprima/Ast/TryStatement.cs index aa34524c..f95e2436 100644 --- a/src/Esprima/Ast/TryStatement.cs +++ b/src/Esprima/Ast/TryStatement.cs @@ -22,7 +22,7 @@ public TryStatement( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt1_2(Block, Handler, Finalizer); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitTryStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitTryStatement(this); public TryStatement UpdateWith(BlockStatement block, CatchClause? handler, BlockStatement? finalizer) { diff --git a/src/Esprima/Ast/UnaryExpression.cs b/src/Esprima/Ast/UnaryExpression.cs index 1a9a0564..1147e335 100644 --- a/src/Esprima/Ast/UnaryExpression.cs +++ b/src/Esprima/Ast/UnaryExpression.cs @@ -77,7 +77,7 @@ public static string GetUnaryOperatorToken(UnaryOperator op) internal sealed override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Argument); - protected internal sealed override object? Accept(AstVisitor visitor) => visitor.VisitUnaryExpression(this); + protected internal sealed override T Accept(AstVisitor visitor) => visitor.VisitUnaryExpression(this); protected virtual UnaryExpression Rewrite(Expression argument) { diff --git a/src/Esprima/Ast/VariableDeclaration.cs b/src/Esprima/Ast/VariableDeclaration.cs index c2b38ea8..d0ab1249 100644 --- a/src/Esprima/Ast/VariableDeclaration.cs +++ b/src/Esprima/Ast/VariableDeclaration.cs @@ -32,7 +32,7 @@ public VariableDeclaration( internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Declarations); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitVariableDeclaration(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitVariableDeclaration(this); public VariableDeclaration UpdateWith(in NodeList declarations) { diff --git a/src/Esprima/Ast/VariableDeclarator.cs b/src/Esprima/Ast/VariableDeclarator.cs index 4a52f7e2..5ccea6cd 100644 --- a/src/Esprima/Ast/VariableDeclarator.cs +++ b/src/Esprima/Ast/VariableDeclarator.cs @@ -20,7 +20,7 @@ public VariableDeclarator(Node id, Expression? init) : internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullableAt1(Id, Init); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitVariableDeclarator(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitVariableDeclarator(this); public VariableDeclarator UpdateWith(Node id, Expression? init) { diff --git a/src/Esprima/Ast/WhileStatement.cs b/src/Esprima/Ast/WhileStatement.cs index 06a782f7..4d254143 100644 --- a/src/Esprima/Ast/WhileStatement.cs +++ b/src/Esprima/Ast/WhileStatement.cs @@ -16,7 +16,7 @@ public WhileStatement(Expression test, Statement body) : base(Nodes.WhileStateme internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Test, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitWhileStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitWhileStatement(this); public WhileStatement UpdateWith(Expression test, Statement body) { diff --git a/src/Esprima/Ast/WithStatement.cs b/src/Esprima/Ast/WithStatement.cs index fbd2436f..72b8facf 100644 --- a/src/Esprima/Ast/WithStatement.cs +++ b/src/Esprima/Ast/WithStatement.cs @@ -16,7 +16,7 @@ public WithStatement(Expression obj, Statement body) : base(Nodes.WithStatement) internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNext(Object, Body); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitWithStatement(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitWithStatement(this); public WithStatement UpdateWith(Expression obj, Statement body) { diff --git a/src/Esprima/Ast/YieldExpression.cs b/src/Esprima/Ast/YieldExpression.cs index a16d02bf..10f74453 100644 --- a/src/Esprima/Ast/YieldExpression.cs +++ b/src/Esprima/Ast/YieldExpression.cs @@ -16,7 +16,7 @@ public YieldExpression(Expression? argument, bool @delegate) : base(Nodes.YieldE internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => enumerator.MoveNextNullable(Argument); - protected internal override object? Accept(AstVisitor visitor) => visitor.VisitYieldExpression(this); + protected internal override T Accept(AstVisitor visitor) => visitor.VisitYieldExpression(this); public YieldExpression UpdateWith(Expression? argument) { diff --git a/src/Esprima/Utils/AstToJsonConverter.cs b/src/Esprima/Utils/AstToJsonConverter.cs index dfb6aff9..a27648ed 100644 --- a/src/Esprima/Utils/AstToJsonConverter.cs +++ b/src/Esprima/Utils/AstToJsonConverter.cs @@ -696,7 +696,7 @@ public ImportCompat() : base(Nodes.Import) { } internal override Node? NextChildNode(ref ChildNodes.Enumerator enumerator) => null; - protected internal override object? Accept(AstVisitor visitor) => ((AstToJsonConverter) visitor).VisitImportCompat(this); + protected internal override T Accept(AstVisitor visitor) => (T) ((visitor as AstToJsonConverter)?.VisitImportCompat(this) ?? throw new InvalidOperationException("Expected AstToJsonConverter")); } protected internal override object? VisitImport(Import import) diff --git a/src/Esprima/Utils/AstVisitor.cs b/src/Esprima/Utils/AstVisitor.cs index a28701db..b3d61466 100644 --- a/src/Esprima/Utils/AstVisitor.cs +++ b/src/Esprima/Utils/AstVisitor.cs @@ -3,17 +3,9 @@ namespace Esprima.Utils; -public class AstVisitor +public class AstVisitor : AstVisitor { - private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] string? callerName = null) => - new NotImplementedException($"The visitor does not support nodes of type {nodeType}. You can override {callerName} to handle this case."); - - public virtual object? Visit(Node node) - { - return node.Accept(this); - } - - protected internal virtual object? VisitAccessorProperty(AccessorProperty accessorProperty) + protected internal override object? VisitAccessorProperty(AccessorProperty accessorProperty) { ref readonly var decorators = ref accessorProperty.Decorators; for (var i = 0; i < decorators.Count; i++) @@ -31,7 +23,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return accessorProperty; } - protected internal virtual object? VisitArrayExpression(ArrayExpression arrayExpression) + protected internal override object? VisitArrayExpression(ArrayExpression arrayExpression) { ref readonly var elements = ref arrayExpression.Elements; for (var i = 0; i < elements.Count; i++) @@ -46,7 +38,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return arrayExpression; } - protected internal virtual object? VisitArrayPattern(ArrayPattern arrayPattern) + protected internal override object? VisitArrayPattern(ArrayPattern arrayPattern) { ref readonly var elements = ref arrayPattern.Elements; for (var i = 0; i < elements.Count; i++) @@ -61,7 +53,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return arrayPattern; } - protected internal virtual object? VisitArrowFunctionExpression(ArrowFunctionExpression arrowFunctionExpression) + protected internal override object? VisitArrowFunctionExpression(ArrowFunctionExpression arrowFunctionExpression) { ref readonly var parameters = ref arrowFunctionExpression.Params; for (var i = 0; i < parameters.Count; i++) @@ -74,7 +66,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return arrowFunctionExpression; } - protected internal virtual object? VisitAssignmentExpression(AssignmentExpression assignmentExpression) + protected internal override object? VisitAssignmentExpression(AssignmentExpression assignmentExpression) { Visit(assignmentExpression.Left); Visit(assignmentExpression.Right); @@ -82,7 +74,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return assignmentExpression; } - protected internal virtual object? VisitAssignmentPattern(AssignmentPattern assignmentPattern) + protected internal override object? VisitAssignmentPattern(AssignmentPattern assignmentPattern) { Visit(assignmentPattern.Left); Visit(assignmentPattern.Right); @@ -90,14 +82,14 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return assignmentPattern; } - protected internal virtual object? VisitAwaitExpression(AwaitExpression awaitExpression) + protected internal override object? VisitAwaitExpression(AwaitExpression awaitExpression) { Visit(awaitExpression.Argument); return awaitExpression; } - protected internal virtual object? VisitBinaryExpression(BinaryExpression binaryExpression) + protected internal override object? VisitBinaryExpression(BinaryExpression binaryExpression) { Visit(binaryExpression.Left); Visit(binaryExpression.Right); @@ -105,7 +97,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return binaryExpression; } - protected internal virtual object? VisitBlockStatement(BlockStatement blockStatement) + protected internal override object? VisitBlockStatement(BlockStatement blockStatement) { ref readonly var body = ref blockStatement.Body; for (var i = 0; i < body.Count; i++) @@ -116,7 +108,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return blockStatement; } - protected internal virtual object? VisitBreakStatement(BreakStatement breakStatement) + protected internal override object? VisitBreakStatement(BreakStatement breakStatement) { if (breakStatement.Label is not null) { @@ -126,7 +118,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return breakStatement; } - protected internal virtual object? VisitCallExpression(CallExpression callExpression) + protected internal override object? VisitCallExpression(CallExpression callExpression) { Visit(callExpression.Callee); ref readonly var arguments = ref callExpression.Arguments; @@ -138,7 +130,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return callExpression; } - protected internal virtual object? VisitCatchClause(CatchClause catchClause) + protected internal override object? VisitCatchClause(CatchClause catchClause) { if (catchClause.Param is not null) { @@ -150,14 +142,14 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return catchClause; } - protected internal virtual object? VisitChainExpression(ChainExpression chainExpression) + protected internal override object? VisitChainExpression(ChainExpression chainExpression) { Visit(chainExpression.Expression); return chainExpression; } - protected internal virtual object? VisitClassBody(ClassBody classBody) + protected internal override object? VisitClassBody(ClassBody classBody) { ref readonly var body = ref classBody.Body; for (var i = 0; i < body.Count; i++) @@ -168,7 +160,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return classBody; } - protected internal virtual object? VisitClassDeclaration(ClassDeclaration classDeclaration) + protected internal override object? VisitClassDeclaration(ClassDeclaration classDeclaration) { ref readonly var decorators = ref classDeclaration.Decorators; for (var i = 0; i < decorators.Count; i++) @@ -191,7 +183,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return classDeclaration; } - protected internal virtual object? VisitClassExpression(ClassExpression classExpression) + protected internal override object? VisitClassExpression(ClassExpression classExpression) { ref readonly var decorators = ref classExpression.Decorators; for (var i = 0; i < decorators.Count; i++) @@ -214,7 +206,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return classExpression; } - protected internal virtual object? VisitConditionalExpression(ConditionalExpression conditionalExpression) + protected internal override object? VisitConditionalExpression(ConditionalExpression conditionalExpression) { Visit(conditionalExpression.Test); Visit(conditionalExpression.Consequent); @@ -223,7 +215,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return conditionalExpression; } - protected internal virtual object? VisitContinueStatement(ContinueStatement continueStatement) + protected internal override object? VisitContinueStatement(ContinueStatement continueStatement) { if (continueStatement.Label is not null) { @@ -233,19 +225,19 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return continueStatement; } - protected internal virtual object? VisitDebuggerStatement(DebuggerStatement debuggerStatement) + protected internal override object? VisitDebuggerStatement(DebuggerStatement debuggerStatement) { return debuggerStatement; } - protected internal virtual object? VisitDecorator(Decorator decorator) + protected internal override object? VisitDecorator(Decorator decorator) { Visit(decorator.Expression); return decorator; } - protected internal virtual object? VisitDoWhileStatement(DoWhileStatement doWhileStatement) + protected internal override object? VisitDoWhileStatement(DoWhileStatement doWhileStatement) { Visit(doWhileStatement.Body); Visit(doWhileStatement.Test); @@ -253,12 +245,12 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return doWhileStatement; } - protected internal virtual object? VisitEmptyStatement(EmptyStatement emptyStatement) + protected internal override object? VisitEmptyStatement(EmptyStatement emptyStatement) { return emptyStatement; } - protected internal virtual object? VisitExportAllDeclaration(ExportAllDeclaration exportAllDeclaration) + protected internal override object? VisitExportAllDeclaration(ExportAllDeclaration exportAllDeclaration) { if (exportAllDeclaration.Exported is not null) { @@ -276,14 +268,14 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return exportAllDeclaration; } - protected internal virtual object? VisitExportDefaultDeclaration(ExportDefaultDeclaration exportDefaultDeclaration) + protected internal override object? VisitExportDefaultDeclaration(ExportDefaultDeclaration exportDefaultDeclaration) { Visit(exportDefaultDeclaration.Declaration); return exportDefaultDeclaration; } - protected internal virtual object? VisitExportNamedDeclaration(ExportNamedDeclaration exportNamedDeclaration) + protected internal override object? VisitExportNamedDeclaration(ExportNamedDeclaration exportNamedDeclaration) { if (exportNamedDeclaration.Declaration is not null) { @@ -310,7 +302,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return exportNamedDeclaration; } - protected internal virtual object? VisitExportSpecifier(ExportSpecifier exportSpecifier) + protected internal override object? VisitExportSpecifier(ExportSpecifier exportSpecifier) { Visit(exportSpecifier.Local); @@ -322,14 +314,14 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return exportSpecifier; } - protected internal virtual object? VisitExpressionStatement(ExpressionStatement expressionStatement) + protected internal override object? VisitExpressionStatement(ExpressionStatement expressionStatement) { Visit(expressionStatement.Expression); return expressionStatement; } - protected internal virtual object? VisitExtension(Node node) + protected internal override object? VisitExtension(Node node) { // Node type Extension is used to represent extensions to the standard AST (for example, see JSX parsing). // Nodes of this type never appear in the tree returned by the core parser (JavaScriptParser), @@ -339,7 +331,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s throw UnsupportedNodeType(node.GetType()); } - protected internal virtual object? VisitForInStatement(ForInStatement forInStatement) + protected internal override object? VisitForInStatement(ForInStatement forInStatement) { Visit(forInStatement.Left); Visit(forInStatement.Right); @@ -348,7 +340,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return forInStatement; } - protected internal virtual object? VisitForOfStatement(ForOfStatement forOfStatement) + protected internal override object? VisitForOfStatement(ForOfStatement forOfStatement) { Visit(forOfStatement.Left); Visit(forOfStatement.Right); @@ -357,7 +349,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return forOfStatement; } - protected internal virtual object? VisitForStatement(ForStatement forStatement) + protected internal override object? VisitForStatement(ForStatement forStatement) { if (forStatement.Init is not null) { @@ -379,7 +371,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return forStatement; } - protected internal virtual object? VisitFunctionDeclaration(FunctionDeclaration functionDeclaration) + protected internal override object? VisitFunctionDeclaration(FunctionDeclaration functionDeclaration) { if (functionDeclaration.Id is not null) { @@ -397,7 +389,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return functionDeclaration; } - protected internal virtual object? VisitFunctionExpression(FunctionExpression functionExpression) + protected internal override object? VisitFunctionExpression(FunctionExpression functionExpression) { if (functionExpression.Id is not null) { @@ -415,12 +407,12 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return functionExpression; } - protected internal virtual object? VisitIdentifier(Identifier identifier) + protected internal override object? VisitIdentifier(Identifier identifier) { return identifier; } - protected internal virtual object? VisitIfStatement(IfStatement ifStatement) + protected internal override object? VisitIfStatement(IfStatement ifStatement) { Visit(ifStatement.Test); Visit(ifStatement.Consequent); @@ -432,7 +424,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return ifStatement; } - protected internal virtual object? VisitImport(Import import) + protected internal override object? VisitImport(Import import) { Visit(import.Source); @@ -444,7 +436,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return import; } - protected internal virtual object? VisitImportAttribute(ImportAttribute importAttribute) + protected internal override object? VisitImportAttribute(ImportAttribute importAttribute) { Visit(importAttribute.Key); Visit(importAttribute.Value); @@ -452,7 +444,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return importAttribute; } - protected internal virtual object? VisitImportDeclaration(ImportDeclaration importDeclaration) + protected internal override object? VisitImportDeclaration(ImportDeclaration importDeclaration) { ref readonly var specifiers = ref importDeclaration.Specifiers; for (var i = 0; i < specifiers.Count; i++) @@ -471,21 +463,21 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return importDeclaration; } - protected internal virtual object? VisitImportDefaultSpecifier(ImportDefaultSpecifier importDefaultSpecifier) + protected internal override object? VisitImportDefaultSpecifier(ImportDefaultSpecifier importDefaultSpecifier) { Visit(importDefaultSpecifier.Local); return importDefaultSpecifier; } - protected internal virtual object? VisitImportNamespaceSpecifier(ImportNamespaceSpecifier importNamespaceSpecifier) + protected internal override object? VisitImportNamespaceSpecifier(ImportNamespaceSpecifier importNamespaceSpecifier) { Visit(importNamespaceSpecifier.Local); return importNamespaceSpecifier; } - protected internal virtual object? VisitImportSpecifier(ImportSpecifier importSpecifier) + protected internal override object? VisitImportSpecifier(ImportSpecifier importSpecifier) { if (importSpecifier.Imported != importSpecifier.Local) { @@ -497,7 +489,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return importSpecifier; } - protected internal virtual object? VisitLabeledStatement(LabeledStatement labeledStatement) + protected internal override object? VisitLabeledStatement(LabeledStatement labeledStatement) { Visit(labeledStatement.Label); Visit(labeledStatement.Body); @@ -505,12 +497,12 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return labeledStatement; } - protected internal virtual object? VisitLiteral(Literal literal) + protected internal override object? VisitLiteral(Literal literal) { return literal; } - protected internal virtual object? VisitMemberExpression(MemberExpression memberExpression) + protected internal override object? VisitMemberExpression(MemberExpression memberExpression) { Visit(memberExpression.Object); Visit(memberExpression.Property); @@ -518,7 +510,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return memberExpression; } - protected internal virtual object? VisitMetaProperty(MetaProperty metaProperty) + protected internal override object? VisitMetaProperty(MetaProperty metaProperty) { Visit(metaProperty.Meta); Visit(metaProperty.Property); @@ -526,7 +518,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return metaProperty; } - protected internal virtual object? VisitMethodDefinition(MethodDefinition methodDefinition) + protected internal override object? VisitMethodDefinition(MethodDefinition methodDefinition) { ref readonly var decorators = ref methodDefinition.Decorators; for (var i = 0; i < decorators.Count; i++) @@ -540,7 +532,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return methodDefinition; } - protected internal virtual object? VisitNewExpression(NewExpression newExpression) + protected internal override object? VisitNewExpression(NewExpression newExpression) { Visit(newExpression.Callee); ref readonly var arguments = ref newExpression.Arguments; @@ -552,7 +544,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return newExpression; } - protected internal virtual object? VisitObjectExpression(ObjectExpression objectExpression) + protected internal override object? VisitObjectExpression(ObjectExpression objectExpression) { ref readonly var properties = ref objectExpression.Properties; for (var i = 0; i < properties.Count; i++) @@ -563,7 +555,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return objectExpression; } - protected internal virtual object? VisitObjectPattern(ObjectPattern objectPattern) + protected internal override object? VisitObjectPattern(ObjectPattern objectPattern) { ref readonly var properties = ref objectPattern.Properties; for (var i = 0; i < properties.Count; i++) @@ -574,12 +566,12 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return objectPattern; } - protected internal virtual object? VisitPrivateIdentifier(PrivateIdentifier privateIdentifier) + protected internal override object? VisitPrivateIdentifier(PrivateIdentifier privateIdentifier) { return privateIdentifier; } - protected internal virtual object? VisitProgram(Program program) + protected internal override object? VisitProgram(Program program) { ref readonly var statements = ref program.Body; for (var i = 0; i < statements.Count; i++) @@ -590,7 +582,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return program; } - protected internal virtual object? VisitProperty(Property property) + protected internal override object? VisitProperty(Property property) { if (!property.Shorthand) { @@ -602,7 +594,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return property; } - protected internal virtual object? VisitPropertyDefinition(PropertyDefinition propertyDefinition) + protected internal override object? VisitPropertyDefinition(PropertyDefinition propertyDefinition) { ref readonly var decorators = ref propertyDefinition.Decorators; for (var i = 0; i < decorators.Count; i++) @@ -620,14 +612,14 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return propertyDefinition; } - protected internal virtual object? VisitRestElement(RestElement restElement) + protected internal override object? VisitRestElement(RestElement restElement) { Visit(restElement.Argument); return restElement; } - protected internal virtual object? VisitReturnStatement(ReturnStatement returnStatement) + protected internal override object? VisitReturnStatement(ReturnStatement returnStatement) { if (returnStatement.Argument is not null) { @@ -637,7 +629,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return returnStatement; } - protected internal virtual object? VisitSequenceExpression(SequenceExpression sequenceExpression) + protected internal override object? VisitSequenceExpression(SequenceExpression sequenceExpression) { ref readonly var expressions = ref sequenceExpression.Expressions; for (var i = 0; i < expressions.Count; i++) @@ -648,14 +640,14 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return sequenceExpression; } - protected internal virtual object? VisitSpreadElement(SpreadElement spreadElement) + protected internal override object? VisitSpreadElement(SpreadElement spreadElement) { Visit(spreadElement.Argument); return spreadElement; } - protected internal virtual object? VisitStaticBlock(StaticBlock staticBlock) + protected internal override object? VisitStaticBlock(StaticBlock staticBlock) { ref readonly var body = ref staticBlock.Body; for (var i = 0; i < body.Count; i++) @@ -666,12 +658,12 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return staticBlock; } - protected internal virtual object? VisitSuper(Super super) + protected internal override object? VisitSuper(Super super) { return super; } - protected internal virtual object? VisitSwitchCase(SwitchCase switchCase) + protected internal override object? VisitSwitchCase(SwitchCase switchCase) { if (switchCase.Test is not null) { @@ -687,7 +679,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return switchCase; } - protected internal virtual object? VisitSwitchStatement(SwitchStatement switchStatement) + protected internal override object? VisitSwitchStatement(SwitchStatement switchStatement) { Visit(switchStatement.Discriminant); ref readonly var cases = ref switchStatement.Cases; @@ -699,7 +691,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return switchStatement; } - protected internal virtual object? VisitTaggedTemplateExpression(TaggedTemplateExpression taggedTemplateExpression) + protected internal override object? VisitTaggedTemplateExpression(TaggedTemplateExpression taggedTemplateExpression) { Visit(taggedTemplateExpression.Tag); Visit(taggedTemplateExpression.Quasi); @@ -707,12 +699,12 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return taggedTemplateExpression; } - protected internal virtual object? VisitTemplateElement(TemplateElement templateElement) + protected internal override object? VisitTemplateElement(TemplateElement templateElement) { return templateElement; } - protected internal virtual object? VisitTemplateLiteral(TemplateLiteral templateLiteral) + protected internal override object? VisitTemplateLiteral(TemplateLiteral templateLiteral) { ref readonly var quasis = ref templateLiteral.Quasis; ref readonly var expressions = ref templateLiteral.Expressions; @@ -728,19 +720,19 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return templateLiteral; } - protected internal virtual object? VisitThisExpression(ThisExpression thisExpression) + protected internal override object? VisitThisExpression(ThisExpression thisExpression) { return thisExpression; } - protected internal virtual object? VisitThrowStatement(ThrowStatement throwStatement) + protected internal override object? VisitThrowStatement(ThrowStatement throwStatement) { Visit(throwStatement.Argument); return throwStatement; } - protected internal virtual object? VisitTryStatement(TryStatement tryStatement) + protected internal override object? VisitTryStatement(TryStatement tryStatement) { Visit(tryStatement.Block); if (tryStatement.Handler is not null) @@ -756,14 +748,14 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return tryStatement; } - protected internal virtual object? VisitUnaryExpression(UnaryExpression unaryExpression) + protected internal override object? VisitUnaryExpression(UnaryExpression unaryExpression) { Visit(unaryExpression.Argument); return unaryExpression; } - protected internal virtual object? VisitVariableDeclaration(VariableDeclaration variableDeclaration) + protected internal override object? VisitVariableDeclaration(VariableDeclaration variableDeclaration) { ref readonly var declarations = ref variableDeclaration.Declarations; for (var i = 0; i < declarations.Count; i++) @@ -774,7 +766,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return variableDeclaration; } - protected internal virtual object? VisitVariableDeclarator(VariableDeclarator variableDeclarator) + protected internal override object? VisitVariableDeclarator(VariableDeclarator variableDeclarator) { Visit(variableDeclarator.Id); if (variableDeclarator.Init is not null) @@ -785,7 +777,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return variableDeclarator; } - protected internal virtual object? VisitWhileStatement(WhileStatement whileStatement) + protected internal override object? VisitWhileStatement(WhileStatement whileStatement) { Visit(whileStatement.Test); Visit(whileStatement.Body); @@ -793,7 +785,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return whileStatement; } - protected internal virtual object? VisitWithStatement(WithStatement withStatement) + protected internal override object? VisitWithStatement(WithStatement withStatement) { Visit(withStatement.Object); Visit(withStatement.Body); @@ -801,7 +793,7 @@ private static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] s return withStatement; } - protected internal virtual object? VisitYieldExpression(YieldExpression yieldExpression) + protected internal override object? VisitYieldExpression(YieldExpression yieldExpression) { if (yieldExpression.Argument is not null) { diff --git a/src/Esprima/Utils/AstVisitorOfT.cs b/src/Esprima/Utils/AstVisitorOfT.cs new file mode 100644 index 00000000..98370d79 --- /dev/null +++ b/src/Esprima/Utils/AstVisitorOfT.cs @@ -0,0 +1,380 @@ +using System.Runtime.CompilerServices; +using Esprima.Ast; + +namespace Esprima.Utils; + +public abstract class AstVisitor +{ + internal static Exception UnsupportedNodeType(Type nodeType, [CallerMemberName] string? callerName = null) => + new NotImplementedException($"The visitor does not support nodes of type {nodeType}. You can override {callerName} to handle this case."); + + public virtual T Visit(Node node) + { + return node.Accept(this); + } + + protected internal virtual T VisitAccessorProperty(AccessorProperty accessorProperty) + { + throw UnsupportedNodeType(accessorProperty.GetType()); + } + + protected internal virtual T VisitArrayExpression(ArrayExpression arrayExpression) + { + throw UnsupportedNodeType(arrayExpression.GetType()); + } + + protected internal virtual T VisitArrayPattern(ArrayPattern arrayPattern) + { + throw UnsupportedNodeType(arrayPattern.GetType()); + } + + protected internal virtual T VisitArrowFunctionExpression(ArrowFunctionExpression arrowFunctionExpression) + { + throw UnsupportedNodeType(arrowFunctionExpression.GetType()); + } + + protected internal virtual T VisitAssignmentExpression(AssignmentExpression assignmentExpression) + { + throw UnsupportedNodeType(assignmentExpression.GetType()); + } + + protected internal virtual T VisitAssignmentPattern(AssignmentPattern assignmentPattern) + { + throw UnsupportedNodeType(assignmentPattern.GetType()); + } + + protected internal virtual T VisitAwaitExpression(AwaitExpression awaitExpression) + { + throw UnsupportedNodeType(awaitExpression.GetType()); + } + + protected internal virtual T VisitBinaryExpression(BinaryExpression binaryExpression) + { + throw UnsupportedNodeType(binaryExpression.GetType()); + } + + protected internal virtual T VisitBlockStatement(BlockStatement blockStatement) + { + throw UnsupportedNodeType(blockStatement.GetType()); + } + + protected internal virtual T VisitBreakStatement(BreakStatement breakStatement) + { + throw UnsupportedNodeType(breakStatement.GetType()); + } + + protected internal virtual T VisitCallExpression(CallExpression callExpression) + { + throw UnsupportedNodeType(callExpression.GetType()); + } + + protected internal virtual T VisitCatchClause(CatchClause catchClause) + { + throw UnsupportedNodeType(catchClause.GetType()); + } + + protected internal virtual T VisitChainExpression(ChainExpression chainExpression) + { + throw UnsupportedNodeType(chainExpression.GetType()); + } + + protected internal virtual T VisitClassBody(ClassBody classBody) + { + throw UnsupportedNodeType(classBody.GetType()); + } + + protected internal virtual T VisitClassDeclaration(ClassDeclaration classDeclaration) + { + throw UnsupportedNodeType(classDeclaration.GetType()); + } + + protected internal virtual T VisitClassExpression(ClassExpression classExpression) + { + throw UnsupportedNodeType(classExpression.GetType()); + } + + protected internal virtual T VisitConditionalExpression(ConditionalExpression conditionalExpression) + { + throw UnsupportedNodeType(conditionalExpression.GetType()); + } + + protected internal virtual T VisitContinueStatement(ContinueStatement continueStatement) + { + throw UnsupportedNodeType(continueStatement.GetType()); + } + + protected internal virtual T VisitDebuggerStatement(DebuggerStatement debuggerStatement) + { + throw UnsupportedNodeType(debuggerStatement.GetType()); + } + + protected internal virtual T VisitDecorator(Decorator decorator) + { + throw UnsupportedNodeType(decorator.GetType()); + } + + protected internal virtual T VisitDoWhileStatement(DoWhileStatement doWhileStatement) + { + throw UnsupportedNodeType(doWhileStatement.GetType()); + } + + protected internal virtual T VisitEmptyStatement(EmptyStatement emptyStatement) + { + throw UnsupportedNodeType(emptyStatement.GetType()); + } + + protected internal virtual T VisitExportAllDeclaration(ExportAllDeclaration exportAllDeclaration) + { + throw UnsupportedNodeType(exportAllDeclaration.GetType()); + } + + protected internal virtual T VisitExportDefaultDeclaration(ExportDefaultDeclaration exportDefaultDeclaration) + { + throw UnsupportedNodeType(exportDefaultDeclaration.GetType()); + } + + protected internal virtual T VisitExportNamedDeclaration(ExportNamedDeclaration exportNamedDeclaration) + { + throw UnsupportedNodeType(exportNamedDeclaration.GetType()); + } + + protected internal virtual T VisitExportSpecifier(ExportSpecifier exportSpecifier) + { + throw UnsupportedNodeType(exportSpecifier.GetType()); + } + + protected internal virtual T VisitExpressionStatement(ExpressionStatement expressionStatement) + { + throw UnsupportedNodeType(expressionStatement.GetType()); + } + + protected internal virtual T VisitExtension(Node node) + { + throw UnsupportedNodeType(node.GetType()); + } + + protected internal virtual T VisitForInStatement(ForInStatement forInStatement) + { + throw UnsupportedNodeType(forInStatement.GetType()); + } + + protected internal virtual T VisitForOfStatement(ForOfStatement forOfStatement) + { + throw UnsupportedNodeType(forOfStatement.GetType()); + } + + protected internal virtual T VisitForStatement(ForStatement forStatement) + { + throw UnsupportedNodeType(forStatement.GetType()); + } + + protected internal virtual T VisitFunctionDeclaration(FunctionDeclaration functionDeclaration) + { + throw UnsupportedNodeType(functionDeclaration.GetType()); + } + + protected internal virtual T VisitFunctionExpression(FunctionExpression functionExpression) + { + throw UnsupportedNodeType(functionExpression.GetType()); + } + + protected internal virtual T VisitIdentifier(Identifier identifier) + { + throw UnsupportedNodeType(identifier.GetType()); + } + + protected internal virtual T VisitIfStatement(IfStatement ifStatement) + { + throw UnsupportedNodeType(ifStatement.GetType()); + } + + protected internal virtual T VisitImport(Import import) + { + throw UnsupportedNodeType(import.GetType()); + } + + protected internal virtual T VisitImportAttribute(ImportAttribute importAttribute) + { + throw UnsupportedNodeType(importAttribute.GetType()); + } + + protected internal virtual T VisitImportDeclaration(ImportDeclaration importDeclaration) + { + throw UnsupportedNodeType(importDeclaration.GetType()); + } + + protected internal virtual T VisitImportDefaultSpecifier(ImportDefaultSpecifier importDefaultSpecifier) + { + throw UnsupportedNodeType(importDefaultSpecifier.GetType()); + } + + protected internal virtual T VisitImportNamespaceSpecifier(ImportNamespaceSpecifier importNamespaceSpecifier) + { + throw UnsupportedNodeType(importNamespaceSpecifier.GetType()); + } + + protected internal virtual T VisitImportSpecifier(ImportSpecifier importSpecifier) + { + throw UnsupportedNodeType(importSpecifier.GetType()); + } + + protected internal virtual T VisitLabeledStatement(LabeledStatement labeledStatement) + { + throw UnsupportedNodeType(labeledStatement.GetType()); + } + + protected internal virtual T VisitLiteral(Literal literal) + { + throw UnsupportedNodeType(literal.GetType()); + } + + protected internal virtual T VisitMemberExpression(MemberExpression memberExpression) + { + throw UnsupportedNodeType(memberExpression.GetType()); + } + + protected internal virtual T VisitMetaProperty(MetaProperty metaProperty) + { + throw UnsupportedNodeType(metaProperty.GetType()); + } + + protected internal virtual T VisitMethodDefinition(MethodDefinition methodDefinition) + { + throw UnsupportedNodeType(methodDefinition.GetType()); + } + + protected internal virtual T VisitNewExpression(NewExpression newExpression) + { + throw UnsupportedNodeType(newExpression.GetType()); + } + + protected internal virtual T VisitObjectExpression(ObjectExpression objectExpression) + { + throw UnsupportedNodeType(objectExpression.GetType()); + } + + protected internal virtual T VisitObjectPattern(ObjectPattern objectPattern) + { + throw UnsupportedNodeType(objectPattern.GetType()); + } + + protected internal virtual T VisitPrivateIdentifier(PrivateIdentifier privateIdentifier) + { + throw UnsupportedNodeType(privateIdentifier.GetType()); + } + + protected internal virtual T VisitProgram(Program program) + { + throw UnsupportedNodeType(program.GetType()); + } + + protected internal virtual T VisitProperty(Property property) + { + throw UnsupportedNodeType(property.GetType()); + } + + protected internal virtual T VisitPropertyDefinition(PropertyDefinition propertyDefinition) + { + throw UnsupportedNodeType(propertyDefinition.GetType()); + } + + protected internal virtual T VisitRestElement(RestElement restElement) + { + throw UnsupportedNodeType(restElement.GetType()); + } + + protected internal virtual T VisitReturnStatement(ReturnStatement returnStatement) + { + throw UnsupportedNodeType(returnStatement.GetType()); + } + + protected internal virtual T VisitSequenceExpression(SequenceExpression sequenceExpression) + { + throw UnsupportedNodeType(sequenceExpression.GetType()); + } + + protected internal virtual T VisitSpreadElement(SpreadElement spreadElement) + { + throw UnsupportedNodeType(spreadElement.GetType()); + } + + protected internal virtual T VisitStaticBlock(StaticBlock staticBlock) + { + throw UnsupportedNodeType(staticBlock.GetType()); + } + + protected internal virtual T VisitSuper(Super super) + { + throw UnsupportedNodeType(super.GetType()); + } + + protected internal virtual T VisitSwitchCase(SwitchCase switchCase) + { + throw UnsupportedNodeType(switchCase.GetType()); + } + + protected internal virtual T VisitSwitchStatement(SwitchStatement switchStatement) + { + throw UnsupportedNodeType(switchStatement.GetType()); + } + + protected internal virtual T VisitTaggedTemplateExpression(TaggedTemplateExpression taggedTemplateExpression) + { + throw UnsupportedNodeType(taggedTemplateExpression.GetType()); + } + + protected internal virtual T VisitTemplateElement(TemplateElement templateElement) + { + throw UnsupportedNodeType(templateElement.GetType()); + } + + protected internal virtual T VisitTemplateLiteral(TemplateLiteral templateLiteral) + { + throw UnsupportedNodeType(templateLiteral.GetType()); + } + + protected internal virtual T VisitThisExpression(ThisExpression thisExpression) + { + throw UnsupportedNodeType(thisExpression.GetType()); + } + + protected internal virtual T VisitThrowStatement(ThrowStatement throwStatement) + { + throw UnsupportedNodeType(throwStatement.GetType()); + } + + protected internal virtual T VisitTryStatement(TryStatement tryStatement) + { + throw UnsupportedNodeType(tryStatement.GetType()); + } + + protected internal virtual T VisitUnaryExpression(UnaryExpression unaryExpression) + { + throw UnsupportedNodeType(unaryExpression.GetType()); + } + + protected internal virtual T VisitVariableDeclaration(VariableDeclaration variableDeclaration) + { + throw UnsupportedNodeType(variableDeclaration.GetType()); + } + + protected internal virtual T VisitVariableDeclarator(VariableDeclarator variableDeclarator) + { + throw UnsupportedNodeType(variableDeclarator.GetType()); + } + + protected internal virtual T VisitWhileStatement(WhileStatement whileStatement) + { + throw UnsupportedNodeType(whileStatement.GetType()); + } + + protected internal virtual T VisitWithStatement(WithStatement withStatement) + { + throw UnsupportedNodeType(withStatement.GetType()); + } + + protected internal virtual T VisitYieldExpression(YieldExpression yieldExpression) + { + throw UnsupportedNodeType(yieldExpression.GetType()); + } +} diff --git a/src/Esprima/Utils/Jsx/IJsxAstVisitor.cs b/src/Esprima/Utils/Jsx/IJsxAstVisitor.cs index b6bcc11e..fbd32029 100644 --- a/src/Esprima/Utils/Jsx/IJsxAstVisitor.cs +++ b/src/Esprima/Utils/Jsx/IJsxAstVisitor.cs @@ -2,19 +2,23 @@ namespace Esprima.Utils.Jsx; -public interface IJsxAstVisitor +public interface IJsxAstVisitor : IJsxAstVisitor { - object? VisitJsxAttribute(JsxAttribute jsxAttribute); - object? VisitJsxClosingElement(JsxClosingElement jsxClosingElement); - object? VisitJsxClosingFragment(JsxClosingFragment jsxClosingFragment); - object? VisitJsxElement(JsxElement jsxElement); - object? VisitJsxEmptyExpression(JsxEmptyExpression jsxEmptyExpression); - object? VisitJsxExpressionContainer(JsxExpressionContainer jsxExpressionContainer); - object? VisitJsxIdentifier(JsxIdentifier jsxIdentifier); - object? VisitJsxMemberExpression(JsxMemberExpression jsxMemberExpression); - object? VisitJsxNamespacedName(JsxNamespacedName jsxNamespacedName); - object? VisitJsxOpeningElement(JsxOpeningElement jsxOpeningElement); - object? VisitJsxOpeningFragment(JsxOpeningFragment jsxOpeningFragment); - object? VisitJsxSpreadAttribute(JsxSpreadAttribute jsxSpreadAttribute); - object? VisitJsxText(JsxText jsxText); +} + +public interface IJsxAstVisitor +{ + T VisitJsxAttribute(JsxAttribute jsxAttribute); + T VisitJsxClosingElement(JsxClosingElement jsxClosingElement); + T VisitJsxClosingFragment(JsxClosingFragment jsxClosingFragment); + T VisitJsxElement(JsxElement jsxElement); + T VisitJsxEmptyExpression(JsxEmptyExpression jsxEmptyExpression); + T VisitJsxExpressionContainer(JsxExpressionContainer jsxExpressionContainer); + T VisitJsxIdentifier(JsxIdentifier jsxIdentifier); + T VisitJsxMemberExpression(JsxMemberExpression jsxMemberExpression); + T VisitJsxNamespacedName(JsxNamespacedName jsxNamespacedName); + T VisitJsxOpeningElement(JsxOpeningElement jsxOpeningElement); + T VisitJsxOpeningFragment(JsxOpeningFragment jsxOpeningFragment); + T VisitJsxSpreadAttribute(JsxSpreadAttribute jsxSpreadAttribute); + T VisitJsxText(JsxText jsxText); } diff --git a/src/Esprima/Utils/Jsx/JsxAstToJavascriptConverter.cs b/src/Esprima/Utils/Jsx/JsxAstToJavascriptConverter.cs index 88951678..9ff1e8f0 100644 --- a/src/Esprima/Utils/Jsx/JsxAstToJavascriptConverter.cs +++ b/src/Esprima/Utils/Jsx/JsxAstToJavascriptConverter.cs @@ -18,7 +18,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri { } - object? IJsxAstVisitor.VisitJsxAttribute(JsxAttribute jsxAttribute) + object? IJsxAstVisitor.VisitJsxAttribute(JsxAttribute jsxAttribute) { Writer.SpaceRecommendedAfterLastToken(); @@ -37,7 +37,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxAttribute; } - object? IJsxAstVisitor.VisitJsxClosingElement(JsxClosingElement jsxClosingElement) + object? IJsxAstVisitor.VisitJsxClosingElement(JsxClosingElement jsxClosingElement) { Writer.WritePunctuator("<", TokenFlags.Leading, ref WriteContext); Writer.WritePunctuator("/", ref WriteContext); @@ -51,7 +51,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxClosingElement; } - object? IJsxAstVisitor.VisitJsxClosingFragment(JsxClosingFragment jsxClosingFragment) + object? IJsxAstVisitor.VisitJsxClosingFragment(JsxClosingFragment jsxClosingFragment) { Writer.WritePunctuator("<", TokenFlags.Leading, ref WriteContext); Writer.WritePunctuator("/", ref WriteContext); @@ -60,7 +60,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxClosingFragment; } - object? IJsxAstVisitor.VisitJsxElement(JsxElement jsxElement) + object? IJsxAstVisitor.VisitJsxElement(JsxElement jsxElement) { WriteContext.SetNodeProperty(nameof(jsxElement.OpeningElement), static node => node.As().OpeningElement); VisitAuxiliaryNode(jsxElement.OpeningElement); @@ -77,12 +77,12 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxElement; } - object? IJsxAstVisitor.VisitJsxEmptyExpression(JsxEmptyExpression jsxEmptyExpression) + object? IJsxAstVisitor.VisitJsxEmptyExpression(JsxEmptyExpression jsxEmptyExpression) { return jsxEmptyExpression; } - object? IJsxAstVisitor.VisitJsxExpressionContainer(JsxExpressionContainer jsxExpressionContainer) + object? IJsxAstVisitor.VisitJsxExpressionContainer(JsxExpressionContainer jsxExpressionContainer) { Writer.WritePunctuator("{", TokenFlags.Leading, ref WriteContext); @@ -95,7 +95,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxExpressionContainer; } - object? IJsxAstVisitor.VisitJsxIdentifier(JsxIdentifier jsxIdentifier) + object? IJsxAstVisitor.VisitJsxIdentifier(JsxIdentifier jsxIdentifier) { WriteContext.SetNodeProperty(nameof(jsxIdentifier.Name), static node => node.As().Name); Writer.WriteIdentifier(jsxIdentifier.Name, ref WriteContext); @@ -103,7 +103,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxIdentifier; } - object? IJsxAstVisitor.VisitJsxMemberExpression(JsxMemberExpression jsxMemberExpression) + object? IJsxAstVisitor.VisitJsxMemberExpression(JsxMemberExpression jsxMemberExpression) { WriteContext.SetNodeProperty(nameof(jsxMemberExpression.Object), static node => node.As().Object); VisitAuxiliaryNode(jsxMemberExpression.Object); @@ -117,7 +117,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxMemberExpression; } - object? IJsxAstVisitor.VisitJsxNamespacedName(JsxNamespacedName jsxNamespacedName) + object? IJsxAstVisitor.VisitJsxNamespacedName(JsxNamespacedName jsxNamespacedName) { WriteContext.SetNodeProperty(nameof(jsxNamespacedName.Namespace), static node => node.As().Namespace); VisitAuxiliaryNode(jsxNamespacedName.Namespace); @@ -131,7 +131,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxNamespacedName; } - object? IJsxAstVisitor.VisitJsxOpeningElement(JsxOpeningElement jsxOpeningElement) + object? IJsxAstVisitor.VisitJsxOpeningElement(JsxOpeningElement jsxOpeningElement) { Writer.WritePunctuator("<", TokenFlags.Leading, ref WriteContext); @@ -152,7 +152,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxOpeningElement; } - object? IJsxAstVisitor.VisitJsxOpeningFragment(JsxOpeningFragment jsxOpeningFragment) + object? IJsxAstVisitor.VisitJsxOpeningFragment(JsxOpeningFragment jsxOpeningFragment) { Writer.WritePunctuator("<", TokenFlags.Leading, ref WriteContext); @@ -168,7 +168,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxOpeningFragment; } - object? IJsxAstVisitor.VisitJsxSpreadAttribute(JsxSpreadAttribute jsxSpreadAttribute) + object? IJsxAstVisitor.VisitJsxSpreadAttribute(JsxSpreadAttribute jsxSpreadAttribute) { Writer.WritePunctuator("{", TokenFlags.Leading | TokenFlags.LeadingSpaceRecommended, ref WriteContext); @@ -185,7 +185,7 @@ public JsxAstToJavaScriptConverter(JavaScriptTextWriter writer, JsxAstToJavaScri return jsxSpreadAttribute; } - object? IJsxAstVisitor.VisitJsxText(JsxText jsxText) + object? IJsxAstVisitor.VisitJsxText(JsxText jsxText) { Writer.WriteLiteral(jsxText.Raw, TokenType.Extension, ref WriteContext); diff --git a/src/Esprima/Utils/Jsx/JsxAstToJsonConverter.cs b/src/Esprima/Utils/Jsx/JsxAstToJsonConverter.cs index 188728cf..859fa165 100644 --- a/src/Esprima/Utils/Jsx/JsxAstToJsonConverter.cs +++ b/src/Esprima/Utils/Jsx/JsxAstToJsonConverter.cs @@ -39,7 +39,7 @@ protected override string GetTokenType(SyntaxToken token) return base.GetTokenType(token); } - object? IJsxAstVisitor.VisitJsxAttribute(JsxAttribute jsxAttribute) + object? IJsxAstVisitor.VisitJsxAttribute(JsxAttribute jsxAttribute) { using (StartNodeObject(jsxAttribute)) { @@ -50,7 +50,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxAttribute; } - object? IJsxAstVisitor.VisitJsxClosingElement(JsxClosingElement jsxClosingElement) + object? IJsxAstVisitor.VisitJsxClosingElement(JsxClosingElement jsxClosingElement) { using (StartNodeObject(jsxClosingElement)) { @@ -60,7 +60,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxClosingElement; } - object? IJsxAstVisitor.VisitJsxClosingFragment(JsxClosingFragment jsxClosingFragment) + object? IJsxAstVisitor.VisitJsxClosingFragment(JsxClosingFragment jsxClosingFragment) { using (StartNodeObject(jsxClosingFragment)) { @@ -69,7 +69,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxClosingFragment; } - object? IJsxAstVisitor.VisitJsxElement(JsxElement jsxElement) + object? IJsxAstVisitor.VisitJsxElement(JsxElement jsxElement) { using (StartNodeObject(jsxElement)) { @@ -81,7 +81,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxElement; } - object? IJsxAstVisitor.VisitJsxEmptyExpression(JsxEmptyExpression jsxEmptyExpression) + object? IJsxAstVisitor.VisitJsxEmptyExpression(JsxEmptyExpression jsxEmptyExpression) { using (StartNodeObject(jsxEmptyExpression)) { @@ -90,7 +90,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxEmptyExpression; } - object? IJsxAstVisitor.VisitJsxExpressionContainer(JsxExpressionContainer jsxExpressionContainer) + object? IJsxAstVisitor.VisitJsxExpressionContainer(JsxExpressionContainer jsxExpressionContainer) { using (StartNodeObject(jsxExpressionContainer)) { @@ -100,7 +100,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxExpressionContainer; } - object? IJsxAstVisitor.VisitJsxIdentifier(JsxIdentifier jsxIdentifier) + object? IJsxAstVisitor.VisitJsxIdentifier(JsxIdentifier jsxIdentifier) { using (StartNodeObject(jsxIdentifier)) { @@ -110,7 +110,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxIdentifier; } - object? IJsxAstVisitor.VisitJsxMemberExpression(JsxMemberExpression jsxMemberExpression) + object? IJsxAstVisitor.VisitJsxMemberExpression(JsxMemberExpression jsxMemberExpression) { using (StartNodeObject(jsxMemberExpression)) { @@ -121,7 +121,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxMemberExpression; } - object? IJsxAstVisitor.VisitJsxNamespacedName(JsxNamespacedName jsxNamespacedName) + object? IJsxAstVisitor.VisitJsxNamespacedName(JsxNamespacedName jsxNamespacedName) { using (StartNodeObject(jsxNamespacedName)) { @@ -132,7 +132,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxNamespacedName; } - object? IJsxAstVisitor.VisitJsxOpeningElement(JsxOpeningElement jsxOpeningElement) + object? IJsxAstVisitor.VisitJsxOpeningElement(JsxOpeningElement jsxOpeningElement) { using (StartNodeObject(jsxOpeningElement)) { @@ -144,7 +144,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxOpeningElement; } - object? IJsxAstVisitor.VisitJsxOpeningFragment(JsxOpeningFragment jsxOpeningFragment) + object? IJsxAstVisitor.VisitJsxOpeningFragment(JsxOpeningFragment jsxOpeningFragment) { using (StartNodeObject(jsxOpeningFragment)) { @@ -154,7 +154,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxOpeningFragment; } - object? IJsxAstVisitor.VisitJsxSpreadAttribute(JsxSpreadAttribute jsxSpreadAttribute) + object? IJsxAstVisitor.VisitJsxSpreadAttribute(JsxSpreadAttribute jsxSpreadAttribute) { using (StartNodeObject(jsxSpreadAttribute)) { @@ -164,7 +164,7 @@ protected override string GetTokenType(SyntaxToken token) return jsxSpreadAttribute; } - object? IJsxAstVisitor.VisitJsxText(JsxText jsxText) + object? IJsxAstVisitor.VisitJsxText(JsxText jsxText) { using (StartNodeObject(jsxText)) { diff --git a/src/Esprima/Utils/Jsx/JsxAstVisitorOfT.cs b/src/Esprima/Utils/Jsx/JsxAstVisitorOfT.cs new file mode 100644 index 00000000..997fe9f7 --- /dev/null +++ b/src/Esprima/Utils/Jsx/JsxAstVisitorOfT.cs @@ -0,0 +1,71 @@ +using Esprima.Ast.Jsx; + +namespace Esprima.Utils.Jsx; + +public class JsxAstVisitor : AstVisitor, IJsxAstVisitor +{ + public virtual T VisitJsxAttribute(JsxAttribute jsxAttribute) + { + throw UnsupportedNodeType(jsxAttribute.GetType()); + } + + public virtual T VisitJsxClosingElement(JsxClosingElement jsxClosingElement) + { + throw UnsupportedNodeType(jsxClosingElement.GetType()); + } + + public virtual T VisitJsxClosingFragment(JsxClosingFragment jsxClosingFragment) + { + throw UnsupportedNodeType(jsxClosingFragment.GetType()); + } + + public virtual T VisitJsxElement(JsxElement jsxElement) + { + throw UnsupportedNodeType(jsxElement.GetType()); + } + + public virtual T VisitJsxEmptyExpression(JsxEmptyExpression jsxEmptyExpression) + { + throw UnsupportedNodeType(jsxEmptyExpression.GetType()); + } + + public virtual T VisitJsxExpressionContainer(JsxExpressionContainer jsxExpressionContainer) + { + throw UnsupportedNodeType(jsxExpressionContainer.GetType()); + } + + public virtual T VisitJsxIdentifier(JsxIdentifier jsxIdentifier) + { + throw UnsupportedNodeType(jsxIdentifier.GetType()); + } + + public virtual T VisitJsxMemberExpression(JsxMemberExpression jsxMemberExpression) + { + throw UnsupportedNodeType(jsxMemberExpression.GetType()); + } + + public virtual T VisitJsxNamespacedName(JsxNamespacedName jsxNamespacedName) + { + throw UnsupportedNodeType(jsxNamespacedName.GetType()); + } + + public virtual T VisitJsxOpeningElement(JsxOpeningElement jsxOpeningElement) + { + throw UnsupportedNodeType(jsxOpeningElement.GetType()); + } + + public virtual T VisitJsxOpeningFragment(JsxOpeningFragment jsxOpeningFragment) + { + throw UnsupportedNodeType(jsxOpeningFragment.GetType()); + } + + public virtual T VisitJsxSpreadAttribute(JsxSpreadAttribute jsxSpreadAttribute) + { + throw UnsupportedNodeType(jsxSpreadAttribute.GetType()); + } + + public virtual T VisitJsxText(JsxText jsxText) + { + throw UnsupportedNodeType(jsxText.GetType()); + } +} diff --git a/test/Esprima.Tests/AstTests.cs b/test/Esprima.Tests/AstTests.cs index 551d1493..0465005e 100644 --- a/test/Esprima.Tests/AstTests.cs +++ b/test/Esprima.Tests/AstTests.cs @@ -92,7 +92,7 @@ public CustomNode(Node node1, Node node2) : base(Nodes.Extension) public Node Node1 { get; } public Node Node2 { get; } - protected internal override object? Accept(AstVisitor visitor) => throw new NotSupportedException(); + protected internal override T Accept(AstVisitor visitor) => throw new NotSupportedException(); protected internal override IEnumerator? GetChildNodes() { diff --git a/test/Esprima.Tests/AstVisitorTests.cs b/test/Esprima.Tests/AstVisitorTests.cs index 75189867..da89cce4 100644 --- a/test/Esprima.Tests/AstVisitorTests.cs +++ b/test/Esprima.Tests/AstVisitorTests.cs @@ -89,4 +89,54 @@ public static IEnumerable SourceFiles(string relativePath) { return Fixtures.SourceFiles(relativePath); } + + [Fact] + public void CanVisitGenericAstVisitor() + { + var parser = new JavaScriptParser(); + var module = parser.ParseModule("10 + 5"); + + var visitor = new CalculatorVisitor(); + var result = visitor.Visit(module); + + Assert.Equal(15, result); + } + + private class CalculatorVisitor : AstVisitor + { + protected internal override double VisitLiteral(Literal literal) + { + return literal.NumericValue ?? throw new NotSupportedException("Only numeric literals are supported."); + } + + protected internal override double VisitProgram(Program program) + { + if (program.Body.Count != 1) + { + throw new NotSupportedException("Only single expression programs are supported"); + } + + return Visit(program.Body[0]); + } + + protected internal override double VisitExpressionStatement(ExpressionStatement expressionStatement) + { + return Visit(expressionStatement.Expression); + } + + protected internal override double VisitBinaryExpression(BinaryExpression binaryExpression) + { + var left = Visit(binaryExpression.Left); + var right = Visit(binaryExpression.Right); + + return binaryExpression.Operator switch + { + BinaryOperator.Plus => left + right, + BinaryOperator.Minus => left - right, + BinaryOperator.Times => left * right, + BinaryOperator.Divide => left / right, + _ => throw new NotSupportedException($"Operator {binaryExpression.Operator} is not supported.") + }; + } + } }