Ast visitor refactoring

This commit is contained in:
Michael Schimmel
2025-12-04 11:28:40 +01:00
parent a7290550e7
commit 9ed563bcc1
4 changed files with 331 additions and 569 deletions
+56 -56
View File
@@ -31,37 +31,37 @@ type
protected
// Override abstract PROCEDURES from TAstVisitor
procedure VisitConstant(const Node: IConstantNode); override;
procedure VisitIdentifier(const Node: IIdentifierNode); override;
procedure VisitKeyword(const Node: IKeywordNode); override;
procedure VisitIfExpression(const Node: IIfExpressionNode); override;
procedure VisitTernaryExpression(const Node: ITernaryExpressionNode); override;
procedure VisitLambdaExpression(const Node: ILambdaExpressionNode); override;
procedure VisitFunctionCall(const Node: IFunctionCallNode); override;
procedure VisitMacroExpansionNode(const Node: IMacroExpansionNode); override;
procedure VisitRecurNode(const Node: IRecurNode); override;
procedure VisitBlockExpression(const Node: IBlockExpressionNode); override;
procedure VisitVariableDeclaration(const Node: IVariableDeclarationNode); override;
procedure VisitAssignment(const Node: IAssignmentNode); override;
procedure VisitMacroDefinition(const Node: IMacroDefinitionNode); override;
procedure VisitQuasiquote(const Node: IQuasiquoteNode); override;
procedure VisitUnquote(const Node: IUnquoteNode); override;
procedure VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); override;
procedure VisitIndexer(const Node: IIndexerNode); override;
procedure VisitMemberAccess(const Node: IMemberAccessNode); override;
procedure VisitRecordLiteral(const Node: IRecordLiteralNode); override;
procedure VisitCreateSeries(const Node: ICreateSeriesNode); override;
procedure VisitAddSeriesItem(const Node: IAddSeriesItemNode); override;
procedure VisitSeriesLength(const Node: ISeriesLengthNode); override;
procedure VisitNop(const Node: INopNode); override;
function VisitConstant(const Node: IConstantNode): TVoid; override;
function VisitIdentifier(const Node: IIdentifierNode): TVoid; override;
function VisitKeyword(const Node: IKeywordNode): TVoid; override;
function VisitIfExpression(const Node: IIfExpressionNode): TVoid; override;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid; override;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid; override;
function VisitFunctionCall(const Node: IFunctionCallNode): TVoid; override;
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid; override;
function VisitRecurNode(const Node: IRecurNode): TVoid; override;
function VisitBlockExpression(const Node: IBlockExpressionNode): TVoid; override;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid; override;
function VisitAssignment(const Node: IAssignmentNode): TVoid; override;
function VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid; override;
function VisitQuasiquote(const Node: IQuasiquoteNode): TVoid; override;
function VisitUnquote(const Node: IUnquoteNode): TVoid; override;
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid; override;
function VisitIndexer(const Node: IIndexerNode): TVoid; override;
function VisitMemberAccess(const Node: IMemberAccessNode): TVoid; override;
function VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid; override;
function VisitCreateSeries(const Node: ICreateSeriesNode): TVoid; override;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid; override;
function VisitSeriesLength(const Node: ISeriesLengthNode): TVoid; override;
function VisitNop(const Node: INopNode): TVoid; override;
// List Visitors are handled implicitly by parent node iteration in Dumper,
// but we implement them empty/default to satisfy the abstract base class if called directly.
procedure VisitParameterList(const Node: IParameterList); override;
procedure VisitArgumentList(const Node: IArgumentList); override;
procedure VisitExpressionList(const Node: IExpressionList); override;
procedure VisitRecordFieldList(const Node: IRecordFieldList); override;
procedure VisitRecordField(const Node: IRecordFieldNode); override;
function VisitParameterList(const Node: IParameterList): TVoid; override;
function VisitArgumentList(const Node: IArgumentList): TVoid; override;
function VisitExpressionList(const Node: IExpressionList): TVoid; override;
function VisitRecordFieldList(const Node: IRecordFieldList): TVoid; override;
function VisitRecordField(const Node: IRecordFieldNode): TVoid; override;
public
constructor Create(const AOutput: TStrings);
@@ -151,12 +151,12 @@ begin
end;
end;
procedure TAstDumper.VisitConstant(const Node: IConstantNode);
function TAstDumper.VisitConstant(const Node: IConstantNode): TVoid;
begin
LogFmt('Constant: %s', [Node.Value.ToString], Node);
end;
procedure TAstDumper.VisitIdentifier(const Node: IIdentifierNode);
function TAstDumper.VisitIdentifier(const Node: IIdentifierNode): TVoid;
var
adr: TResolvedAddress;
begin
@@ -167,12 +167,12 @@ begin
LogFmt('Identifier: %s (unbound)', [Node.Name], Node);
end;
procedure TAstDumper.VisitKeyword(const Node: IKeywordNode);
function TAstDumper.VisitKeyword(const Node: IKeywordNode): TVoid;
begin
LogFmt('Keyword: :%s', [Node.Value.Name], Node);
end;
procedure TAstDumper.VisitIfExpression(const Node: IIfExpressionNode);
function TAstDumper.VisitIfExpression(const Node: IIfExpressionNode): TVoid;
begin
Log('IfExpression', Node);
Indent;
@@ -188,7 +188,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitTernaryExpression(const Node: ITernaryExpressionNode);
function TAstDumper.VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid;
begin
Log('TernaryExpression', Node);
Indent;
@@ -201,7 +201,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitLambdaExpression(const Node: ILambdaExpressionNode);
function TAstDumper.VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid;
var
upvalueAddr: TResolvedAddress;
symbols: TArray<string>;
@@ -265,7 +265,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitFunctionCall(const Node: IFunctionCallNode);
function TAstDumper.VisitFunctionCall(const Node: IFunctionCallNode): TVoid;
var
arg: IAstNode;
staticStatus: string;
@@ -309,7 +309,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitMacroExpansionNode(const Node: IMacroExpansionNode);
function TAstDumper.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid;
var
arg: IAstNode;
begin
@@ -335,7 +335,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitRecurNode(const Node: IRecurNode);
function TAstDumper.VisitRecurNode(const Node: IRecurNode): TVoid;
var
arg: IAstNode;
begin
@@ -349,7 +349,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitBlockExpression(const Node: IBlockExpressionNode);
function TAstDumper.VisitBlockExpression(const Node: IBlockExpressionNode): TVoid;
var
expr: IAstNode;
begin
@@ -360,7 +360,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitVariableDeclaration(const Node: IVariableDeclarationNode);
function TAstDumper.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid;
begin
LogFmt('VariableDeclaration (IsBoxed: %s)', [Node.IsBoxed.ToString(TUseBoolStrs.True)], Node);
Indent;
@@ -373,7 +373,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitAssignment(const Node: IAssignmentNode);
function TAstDumper.VisitAssignment(const Node: IAssignmentNode): TVoid;
begin
Log('Assignment', Node);
Indent;
@@ -383,7 +383,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitMacroDefinition(const Node: IMacroDefinitionNode);
function TAstDumper.VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid;
begin
Log('MacroDefinition', Node);
Indent;
@@ -407,7 +407,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitQuasiquote(const Node: IQuasiquoteNode);
function TAstDumper.VisitQuasiquote(const Node: IQuasiquoteNode): TVoid;
begin
Log('Quasiquote', Node);
Indent;
@@ -415,7 +415,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitUnquote(const Node: IUnquoteNode);
function TAstDumper.VisitUnquote(const Node: IUnquoteNode): TVoid;
begin
Log('Unquote', Node);
Indent;
@@ -423,7 +423,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode);
function TAstDumper.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid;
begin
Log('UnquoteSplicing', Node);
Indent;
@@ -431,7 +431,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitIndexer(const Node: IIndexerNode);
function TAstDumper.VisitIndexer(const Node: IIndexerNode): TVoid;
begin
Log('Indexer', Node);
Indent;
@@ -442,7 +442,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitMemberAccess(const Node: IMemberAccessNode);
function TAstDumper.VisitMemberAccess(const Node: IMemberAccessNode): TVoid;
begin
Log('MemberAccess', Node);
Indent;
@@ -453,7 +453,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitRecordLiteral(const Node: IRecordLiteralNode);
function TAstDumper.VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid;
var
field: IRecordFieldNode;
begin
@@ -470,12 +470,12 @@ begin
Unindent;
end;
procedure TAstDumper.VisitCreateSeries(const Node: ICreateSeriesNode);
function TAstDumper.VisitCreateSeries(const Node: ICreateSeriesNode): TVoid;
begin
LogFmt('CreateSeries: %s', [Node.Definition], Node);
end;
procedure TAstDumper.VisitAddSeriesItem(const Node: IAddSeriesItemNode);
function TAstDumper.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid;
begin
Log('AddSeriesItem', Node);
Indent;
@@ -491,7 +491,7 @@ begin
Unindent;
end;
procedure TAstDumper.VisitSeriesLength(const Node: ISeriesLengthNode);
function TAstDumper.VisitSeriesLength(const Node: ISeriesLengthNode): TVoid;
begin
Log('SeriesLength', Node);
Indent;
@@ -500,14 +500,14 @@ begin
Unindent;
end;
procedure TAstDumper.VisitNop(const Node: INopNode);
function TAstDumper.VisitNop(const Node: INopNode): TVoid;
begin
Log('Nop', Node);
end;
// --- List Visitors Implementation ---
procedure TAstDumper.VisitParameterList(const Node: IParameterList);
function TAstDumper.VisitParameterList(const Node: IParameterList): TVoid;
begin
// Usually handled by Parent Node iteration (Lambda),
// but if visited directly:
@@ -515,25 +515,25 @@ begin
item.Accept(Self);
end;
procedure TAstDumper.VisitArgumentList(const Node: IArgumentList);
function TAstDumper.VisitArgumentList(const Node: IArgumentList): TVoid;
begin
for var item in Node do
item.Accept(Self);
end;
procedure TAstDumper.VisitExpressionList(const Node: IExpressionList);
function TAstDumper.VisitExpressionList(const Node: IExpressionList): TVoid;
begin
for var item in Node do
item.Accept(Self);
end;
procedure TAstDumper.VisitRecordFieldList(const Node: IRecordFieldList);
function TAstDumper.VisitRecordFieldList(const Node: IRecordFieldList): TVoid;
begin
for var item in Node do
item.Accept(Self);
end;
procedure TAstDumper.VisitRecordField(const Node: IRecordFieldNode);
function TAstDumper.VisitRecordField(const Node: IRecordFieldNode): TVoid;
begin
// If visited directly (e.g. inside a list)
LogFmt('Field :%s', [Node.Key.Value.Name]);