Ast visitor refactoring
This commit is contained in:
+56
-56
@@ -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]);
|
||||
|
||||
Reference in New Issue
Block a user