Ast visitor refactoring
This commit is contained in:
+217
-455
@@ -82,36 +82,37 @@ type
|
||||
// Visit a node.
|
||||
function Accept(const Node: IAstNode): T; virtual;
|
||||
|
||||
function VisitConstant(const Node: IConstantNode): T; virtual; abstract;
|
||||
function VisitIdentifier(const Node: IIdentifierNode): T; virtual; abstract;
|
||||
function VisitKeyword(const Node: IKeywordNode): T; virtual; abstract;
|
||||
// Default visitor functions implemented analogous to TAstVisitor
|
||||
function VisitConstant(const Node: IConstantNode): T; virtual;
|
||||
function VisitIdentifier(const Node: IIdentifierNode): T; virtual;
|
||||
function VisitKeyword(const Node: IKeywordNode): T; virtual;
|
||||
|
||||
function VisitParameterList(const Node: IParameterList): T; virtual; abstract;
|
||||
function VisitArgumentList(const Node: IArgumentList): T; virtual; abstract;
|
||||
function VisitExpressionList(const Node: IExpressionList): T; virtual; abstract;
|
||||
function VisitRecordFieldList(const Node: IRecordFieldList): T; virtual; abstract;
|
||||
function VisitRecordField(const Node: IRecordFieldNode): T; virtual; abstract;
|
||||
function VisitParameterList(const Node: IParameterList): T; virtual;
|
||||
function VisitArgumentList(const Node: IArgumentList): T; virtual;
|
||||
function VisitExpressionList(const Node: IExpressionList): T; virtual;
|
||||
function VisitRecordFieldList(const Node: IRecordFieldList): T; virtual;
|
||||
function VisitRecordField(const Node: IRecordFieldNode): T; virtual;
|
||||
|
||||
function VisitIfExpression(const Node: IIfExpressionNode): T; virtual; abstract;
|
||||
function VisitTernaryExpression(const Node: ITernaryExpressionNode): T; virtual; abstract;
|
||||
function VisitLambdaExpression(const Node: ILambdaExpressionNode): T; virtual; abstract;
|
||||
function VisitFunctionCall(const Node: IFunctionCallNode): T; virtual; abstract;
|
||||
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): T; virtual; abstract;
|
||||
function VisitBlockExpression(const Node: IBlockExpressionNode): T; virtual; abstract;
|
||||
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): T; virtual; abstract;
|
||||
function VisitAssignment(const Node: IAssignmentNode): T; virtual; abstract;
|
||||
function VisitMacroDefinition(const Node: IMacroDefinitionNode): T; virtual; abstract;
|
||||
function VisitQuasiquote(const Node: IQuasiquoteNode): T; virtual; abstract;
|
||||
function VisitUnquote(const Node: IUnquoteNode): T; virtual; abstract;
|
||||
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T; virtual; abstract;
|
||||
function VisitIndexer(const Node: IIndexerNode): T; virtual; abstract;
|
||||
function VisitMemberAccess(const Node: IMemberAccessNode): T; virtual; abstract;
|
||||
function VisitRecordLiteral(const Node: IRecordLiteralNode): T; virtual; abstract;
|
||||
function VisitCreateSeries(const Node: ICreateSeriesNode): T; virtual; abstract;
|
||||
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): T; virtual; abstract;
|
||||
function VisitSeriesLength(const Node: ISeriesLengthNode): T; virtual; abstract;
|
||||
function VisitRecurNode(const Node: IRecurNode): T; virtual; abstract;
|
||||
function VisitNop(const Node: INopNode): T; virtual; abstract;
|
||||
function VisitIfExpression(const Node: IIfExpressionNode): T; virtual;
|
||||
function VisitTernaryExpression(const Node: ITernaryExpressionNode): T; virtual;
|
||||
function VisitLambdaExpression(const Node: ILambdaExpressionNode): T; virtual;
|
||||
function VisitFunctionCall(const Node: IFunctionCallNode): T; virtual;
|
||||
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): T; virtual;
|
||||
function VisitBlockExpression(const Node: IBlockExpressionNode): T; virtual;
|
||||
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): T; virtual;
|
||||
function VisitAssignment(const Node: IAssignmentNode): T; virtual;
|
||||
function VisitMacroDefinition(const Node: IMacroDefinitionNode): T; virtual;
|
||||
function VisitQuasiquote(const Node: IQuasiquoteNode): T; virtual;
|
||||
function VisitUnquote(const Node: IUnquoteNode): T; virtual;
|
||||
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T; virtual;
|
||||
function VisitIndexer(const Node: IIndexerNode): T; virtual;
|
||||
function VisitMemberAccess(const Node: IMemberAccessNode): T; virtual;
|
||||
function VisitRecordLiteral(const Node: IRecordLiteralNode): T; virtual;
|
||||
function VisitCreateSeries(const Node: ICreateSeriesNode): T; virtual;
|
||||
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): T; virtual;
|
||||
function VisitSeriesLength(const Node: ISeriesLengthNode): T; virtual;
|
||||
function VisitRecurNode(const Node: IRecurNode): T; virtual;
|
||||
function VisitNop(const Node: INopNode): T; virtual;
|
||||
end;
|
||||
|
||||
TAstTransformer = class abstract(TAstVisitor<IAstNode>)
|
||||
@@ -148,105 +149,11 @@ type
|
||||
function VisitNop(const Node: INopNode): IAstNode; override;
|
||||
end;
|
||||
|
||||
TAstVisitor = class(TInterfacedObject, IAstVisitor)
|
||||
strict private
|
||||
// IAstVisitor explicit implementation (bridge methods)
|
||||
function IAstVisitor.VisitConstant = DoVisitConstant;
|
||||
function IAstVisitor.VisitIdentifier = DoVisitIdentifier;
|
||||
function IAstVisitor.VisitKeyword = DoVisitKeyword;
|
||||
function IAstVisitor.VisitParameterList = DoVisitParameterList;
|
||||
function IAstVisitor.VisitArgumentList = DoVisitArgumentList;
|
||||
function IAstVisitor.VisitExpressionList = DoVisitExpressionList;
|
||||
function IAstVisitor.VisitRecordFieldList = DoVisitRecordFieldList;
|
||||
function IAstVisitor.VisitRecordField = DoVisitRecordField;
|
||||
function IAstVisitor.VisitIfExpression = DoVisitIfExpression;
|
||||
function IAstVisitor.VisitTernaryExpression = DoVisitTernaryExpression;
|
||||
function IAstVisitor.VisitLambdaExpression = DoVisitLambdaExpression;
|
||||
function IAstVisitor.VisitFunctionCall = DoVisitFunctionCall;
|
||||
function IAstVisitor.VisitMacroExpansionNode = DoVisitMacroExpansionNode;
|
||||
function IAstVisitor.VisitBlockExpression = DoVisitBlockExpression;
|
||||
function IAstVisitor.VisitVariableDeclaration = DoVisitVariableDeclaration;
|
||||
function IAstVisitor.VisitAssignment = DoVisitAssignment;
|
||||
function IAstVisitor.VisitMacroDefinition = DoVisitMacroDefinition;
|
||||
function IAstVisitor.VisitQuasiquote = DoVisitQuasiquote;
|
||||
function IAstVisitor.VisitUnquote = DoVisitUnquote;
|
||||
function IAstVisitor.VisitUnquoteSplicing = DoVisitUnquoteSplicing;
|
||||
function IAstVisitor.VisitIndexer = DoVisitIndexer;
|
||||
function IAstVisitor.VisitMemberAccess = DoVisitMemberAccess;
|
||||
function IAstVisitor.VisitRecordLiteral = DoVisitRecordLiteral;
|
||||
function IAstVisitor.VisitCreateSeries = DoVisitCreateSeries;
|
||||
function IAstVisitor.VisitAddSeriesItem = DoVisitAddSeriesItem;
|
||||
function IAstVisitor.VisitSeriesLength = DoVisitSeriesLength;
|
||||
function IAstVisitor.VisitRecurNode = DoVisitRecurNode;
|
||||
function IAstVisitor.VisitNop = DoVisitNop;
|
||||
|
||||
// Private bridge method implementations
|
||||
function DoVisitConstant(const Node: IConstantNode): TDataValue;
|
||||
function DoVisitIdentifier(const Node: IIdentifierNode): TDataValue;
|
||||
function DoVisitKeyword(const Node: IKeywordNode): TDataValue;
|
||||
function DoVisitParameterList(const Node: IParameterList): TDataValue;
|
||||
function DoVisitArgumentList(const Node: IArgumentList): TDataValue;
|
||||
function DoVisitExpressionList(const Node: IExpressionList): TDataValue;
|
||||
function DoVisitRecordFieldList(const Node: IRecordFieldList): TDataValue;
|
||||
function DoVisitRecordField(const Node: IRecordFieldNode): TDataValue;
|
||||
function DoVisitIfExpression(const Node: IIfExpressionNode): TDataValue;
|
||||
function DoVisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
|
||||
function DoVisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
|
||||
function DoVisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
|
||||
function DoVisitMacroExpansionNode(const Node: IMacroExpansionNode): TDataValue;
|
||||
function DoVisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
|
||||
function DoVisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
|
||||
function DoVisitAssignment(const Node: IAssignmentNode): TDataValue;
|
||||
function DoVisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue;
|
||||
function DoVisitQuasiquote(const Node: IQuasiquoteNode): TDataValue;
|
||||
function DoVisitUnquote(const Node: IUnquoteNode): TDataValue;
|
||||
function DoVisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue;
|
||||
function DoVisitIndexer(const Node: IIndexerNode): TDataValue;
|
||||
function DoVisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
|
||||
function DoVisitRecordLiteral(const Node: IRecordLiteralNode): TDataValue;
|
||||
function DoVisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
|
||||
function DoVisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
|
||||
function DoVisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
|
||||
function DoVisitRecurNode(const Node: IRecurNode): TDataValue;
|
||||
function DoVisitNop(const Node: INopNode): TDataValue;
|
||||
|
||||
protected
|
||||
// Entry point for traversal
|
||||
procedure Accept(const Node: IAstNode); virtual;
|
||||
|
||||
// Virtual procedures with default traversal implementation
|
||||
procedure VisitConstant(const Node: IConstantNode); virtual;
|
||||
procedure VisitIdentifier(const Node: IIdentifierNode); virtual;
|
||||
procedure VisitKeyword(const Node: IKeywordNode); virtual;
|
||||
|
||||
procedure VisitParameterList(const Node: IParameterList); virtual;
|
||||
procedure VisitArgumentList(const Node: IArgumentList); virtual;
|
||||
procedure VisitExpressionList(const Node: IExpressionList); virtual;
|
||||
procedure VisitRecordFieldList(const Node: IRecordFieldList); virtual;
|
||||
procedure VisitRecordField(const Node: IRecordFieldNode); virtual;
|
||||
|
||||
procedure VisitIfExpression(const Node: IIfExpressionNode); virtual;
|
||||
procedure VisitTernaryExpression(const Node: ITernaryExpressionNode); virtual;
|
||||
procedure VisitLambdaExpression(const Node: ILambdaExpressionNode); virtual;
|
||||
procedure VisitFunctionCall(const Node: IFunctionCallNode); virtual;
|
||||
procedure VisitMacroExpansionNode(const Node: IMacroExpansionNode); virtual;
|
||||
procedure VisitBlockExpression(const Node: IBlockExpressionNode); virtual;
|
||||
procedure VisitVariableDeclaration(const Node: IVariableDeclarationNode); virtual;
|
||||
procedure VisitAssignment(const Node: IAssignmentNode); virtual;
|
||||
procedure VisitMacroDefinition(const Node: IMacroDefinitionNode); virtual;
|
||||
procedure VisitQuasiquote(const Node: IQuasiquoteNode); virtual;
|
||||
procedure VisitUnquote(const Node: IUnquoteNode); virtual;
|
||||
procedure VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); virtual;
|
||||
procedure VisitIndexer(const Node: IIndexerNode); virtual;
|
||||
procedure VisitMemberAccess(const Node: IMemberAccessNode); virtual;
|
||||
procedure VisitRecordLiteral(const Node: IRecordLiteralNode); virtual;
|
||||
procedure VisitCreateSeries(const Node: ICreateSeriesNode); virtual;
|
||||
procedure VisitAddSeriesItem(const Node: IAddSeriesItemNode); virtual;
|
||||
procedure VisitSeriesLength(const Node: ISeriesLengthNode); virtual;
|
||||
procedure VisitRecurNode(const Node: IRecurNode); virtual;
|
||||
procedure VisitNop(const Node: INopNode); virtual;
|
||||
TVoid = record
|
||||
end;
|
||||
|
||||
TAstVisitor = class(TAstVisitor<TVoid>);
|
||||
|
||||
implementation
|
||||
|
||||
{ TAstVisitor<T> }
|
||||
@@ -374,6 +281,191 @@ begin
|
||||
Result := TDataValue.FromGeneric<T>(VisitNop(Node));
|
||||
end;
|
||||
|
||||
// --- Default implementations (analogous to TAstVisitor) ---
|
||||
|
||||
function TAstVisitor<T>.VisitConstant(const Node: IConstantNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitIdentifier(const Node: IIdentifierNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitKeyword(const Node: IKeywordNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitParameterList(const Node: IParameterList): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
for var Item in Node do
|
||||
Accept(Item);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitArgumentList(const Node: IArgumentList): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
for var Item in Node do
|
||||
Accept(Item);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitExpressionList(const Node: IExpressionList): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
for var Item in Node do
|
||||
Accept(Item);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitRecordFieldList(const Node: IRecordFieldList): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
for var Item in Node do
|
||||
Accept(Item);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitRecordField(const Node: IRecordFieldNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Key);
|
||||
Accept(Node.Value);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitIfExpression(const Node: IIfExpressionNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Condition);
|
||||
Accept(Node.ThenBranch);
|
||||
Accept(Node.ElseBranch);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitTernaryExpression(const Node: ITernaryExpressionNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Condition);
|
||||
Accept(Node.ThenBranch);
|
||||
Accept(Node.ElseBranch);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitLambdaExpression(const Node: ILambdaExpressionNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Parameters);
|
||||
Accept(Node.Body);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitFunctionCall(const Node: IFunctionCallNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Callee);
|
||||
Accept(Node.Arguments);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitMacroExpansionNode(const Node: IMacroExpansionNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.CallNode);
|
||||
Accept(Node.ExpandedBody);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitBlockExpression(const Node: IBlockExpressionNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Expressions);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitVariableDeclaration(const Node: IVariableDeclarationNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Target);
|
||||
Accept(Node.Initializer);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitAssignment(const Node: IAssignmentNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Target);
|
||||
Accept(Node.Value);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitMacroDefinition(const Node: IMacroDefinitionNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Name);
|
||||
Accept(Node.Parameters);
|
||||
Accept(Node.Body);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitQuasiquote(const Node: IQuasiquoteNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Expression);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitUnquote(const Node: IUnquoteNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Expression);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Expression);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitIndexer(const Node: IIndexerNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Base);
|
||||
Accept(Node.Index);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitMemberAccess(const Node: IMemberAccessNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Base);
|
||||
Accept(Node.Member);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitRecordLiteral(const Node: IRecordLiteralNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Fields);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitCreateSeries(const Node: ICreateSeriesNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitAddSeriesItem(const Node: IAddSeriesItemNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Series);
|
||||
Accept(Node.Value);
|
||||
Accept(Node.Lookback);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitSeriesLength(const Node: ISeriesLengthNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Series);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitRecurNode(const Node: IRecurNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
Accept(Node.Arguments);
|
||||
end;
|
||||
|
||||
function TAstVisitor<T>.VisitNop(const Node: INopNode): T;
|
||||
begin
|
||||
Result := Default(T);
|
||||
end;
|
||||
|
||||
{ TAstTransformer }
|
||||
|
||||
// --- Base Virtual Implementations ---
|
||||
@@ -767,334 +859,4 @@ begin
|
||||
Result := TRecurNode.Create(newArgs, Node.StaticType, Node.Identity);
|
||||
end;
|
||||
|
||||
{ TAstVisitor }
|
||||
|
||||
procedure TAstVisitor.Accept(const Node: IAstNode);
|
||||
begin
|
||||
if Assigned(Node) then
|
||||
Node.Accept(Self);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitConstant(const Node: IConstantNode);
|
||||
begin
|
||||
end;
|
||||
procedure TAstVisitor.VisitIdentifier(const Node: IIdentifierNode);
|
||||
begin
|
||||
end;
|
||||
procedure TAstVisitor.VisitKeyword(const Node: IKeywordNode);
|
||||
begin
|
||||
end;
|
||||
procedure TAstVisitor.VisitNop(const Node: INopNode);
|
||||
begin
|
||||
end;
|
||||
procedure TAstVisitor.VisitCreateSeries(const Node: ICreateSeriesNode);
|
||||
begin
|
||||
end;
|
||||
|
||||
// List visitors iterate children by default
|
||||
procedure TAstVisitor.VisitParameterList(const Node: IParameterList);
|
||||
begin
|
||||
for var item in Node do
|
||||
Accept(item);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitArgumentList(const Node: IArgumentList);
|
||||
begin
|
||||
for var item in Node do
|
||||
Accept(item);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitExpressionList(const Node: IExpressionList);
|
||||
begin
|
||||
for var item in Node do
|
||||
Accept(item);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitRecordFieldList(const Node: IRecordFieldList);
|
||||
begin
|
||||
for var item in Node do
|
||||
Accept(item);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitRecordField(const Node: IRecordFieldNode);
|
||||
begin
|
||||
Accept(Node.Key);
|
||||
Accept(Node.Value);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitIfExpression(const Node: IIfExpressionNode);
|
||||
begin
|
||||
Accept(Node.Condition);
|
||||
Accept(Node.ThenBranch);
|
||||
Accept(Node.ElseBranch);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode);
|
||||
begin
|
||||
Accept(Node.Condition);
|
||||
Accept(Node.ThenBranch);
|
||||
Accept(Node.ElseBranch);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode);
|
||||
begin
|
||||
Accept(Node.Parameters);
|
||||
Accept(Node.Body);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitFunctionCall(const Node: IFunctionCallNode);
|
||||
begin
|
||||
Accept(Node.Callee);
|
||||
Accept(Node.Arguments);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode);
|
||||
begin
|
||||
Accept(Node.CallNode);
|
||||
Accept(Node.ExpandedBody);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitBlockExpression(const Node: IBlockExpressionNode);
|
||||
begin
|
||||
Accept(Node.Expressions);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode);
|
||||
begin
|
||||
Accept(Node.Target);
|
||||
Accept(Node.Initializer);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitAssignment(const Node: IAssignmentNode);
|
||||
begin
|
||||
Accept(Node.Target);
|
||||
Accept(Node.Value);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode);
|
||||
begin
|
||||
Accept(Node.Name);
|
||||
Accept(Node.Parameters);
|
||||
Accept(Node.Body);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitQuasiquote(const Node: IQuasiquoteNode);
|
||||
begin
|
||||
Accept(Node.Expression);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitUnquote(const Node: IUnquoteNode);
|
||||
begin
|
||||
Accept(Node.Expression);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode);
|
||||
begin
|
||||
Accept(Node.Expression);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitIndexer(const Node: IIndexerNode);
|
||||
begin
|
||||
Accept(Node.Base);
|
||||
Accept(Node.Index);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitMemberAccess(const Node: IMemberAccessNode);
|
||||
begin
|
||||
Accept(Node.Base);
|
||||
Accept(Node.Member);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode);
|
||||
begin
|
||||
Accept(Node.Fields);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode);
|
||||
begin
|
||||
Accept(Node.Series);
|
||||
Accept(Node.Value);
|
||||
Accept(Node.Lookback);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitSeriesLength(const Node: ISeriesLengthNode);
|
||||
begin
|
||||
Accept(Node.Series);
|
||||
end;
|
||||
|
||||
procedure TAstVisitor.VisitRecurNode(const Node: IRecurNode);
|
||||
begin
|
||||
Accept(Node.Arguments);
|
||||
end;
|
||||
|
||||
// --- TAstVisitor (Non-Generic) Bridge Implementations ---
|
||||
|
||||
function TAstVisitor.DoVisitConstant(const Node: IConstantNode): TDataValue;
|
||||
begin
|
||||
VisitConstant(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitIdentifier(const Node: IIdentifierNode): TDataValue;
|
||||
begin
|
||||
VisitIdentifier(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitKeyword(const Node: IKeywordNode): TDataValue;
|
||||
begin
|
||||
VisitKeyword(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitParameterList(const Node: IParameterList): TDataValue;
|
||||
begin
|
||||
VisitParameterList(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitArgumentList(const Node: IArgumentList): TDataValue;
|
||||
begin
|
||||
VisitArgumentList(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitExpressionList(const Node: IExpressionList): TDataValue;
|
||||
begin
|
||||
VisitExpressionList(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitRecordFieldList(const Node: IRecordFieldList): TDataValue;
|
||||
begin
|
||||
VisitRecordFieldList(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitRecordField(const Node: IRecordFieldNode): TDataValue;
|
||||
begin
|
||||
VisitRecordField(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitIfExpression(const Node: IIfExpressionNode): TDataValue;
|
||||
begin
|
||||
VisitIfExpression(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
|
||||
begin
|
||||
VisitTernaryExpression(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
|
||||
begin
|
||||
VisitLambdaExpression(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
|
||||
begin
|
||||
VisitFunctionCall(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitMacroExpansionNode(const Node: IMacroExpansionNode): TDataValue;
|
||||
begin
|
||||
VisitMacroExpansionNode(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
|
||||
begin
|
||||
VisitBlockExpression(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
|
||||
begin
|
||||
VisitVariableDeclaration(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitAssignment(const Node: IAssignmentNode): TDataValue;
|
||||
begin
|
||||
VisitAssignment(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue;
|
||||
begin
|
||||
VisitMacroDefinition(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitQuasiquote(const Node: IQuasiquoteNode): TDataValue;
|
||||
begin
|
||||
VisitQuasiquote(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitUnquote(const Node: IUnquoteNode): TDataValue;
|
||||
begin
|
||||
VisitUnquote(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue;
|
||||
begin
|
||||
VisitUnquoteSplicing(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitIndexer(const Node: IIndexerNode): TDataValue;
|
||||
begin
|
||||
VisitIndexer(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
|
||||
begin
|
||||
VisitMemberAccess(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitRecordLiteral(const Node: IRecordLiteralNode): TDataValue;
|
||||
begin
|
||||
VisitRecordLiteral(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
|
||||
begin
|
||||
VisitCreateSeries(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
|
||||
begin
|
||||
VisitAddSeriesItem(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
|
||||
begin
|
||||
VisitSeriesLength(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitRecurNode(const Node: IRecurNode): TDataValue;
|
||||
begin
|
||||
VisitRecurNode(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
function TAstVisitor.DoVisitNop(const Node: INopNode): TDataValue;
|
||||
begin
|
||||
VisitNop(Node);
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user