diff --git a/Src/AST/Myc.Ast.Dumper.pas b/Src/AST/Myc.Ast.Dumper.pas index b43ca44..99934be 100644 --- a/Src/AST/Myc.Ast.Dumper.pas +++ b/Src/AST/Myc.Ast.Dumper.pas @@ -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; @@ -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]); diff --git a/Src/AST/Myc.Ast.Script.pas b/Src/AST/Myc.Ast.Script.pas index 9535d3b..b32d264 100644 --- a/Src/AST/Myc.Ast.Script.pas +++ b/Src/AST/Myc.Ast.Script.pas @@ -194,37 +194,37 @@ type function GetResult: string; function Execute(const RootNode: IAstNode): TDataValue; - procedure VisitConstant(const Node: IConstantNode); override; - procedure VisitIdentifier(const Node: IIdentifierNode); override; - procedure VisitKeyword(const Node: IKeywordNode); override; + function VisitConstant(const Node: IConstantNode): TVoid; override; + function VisitIdentifier(const Node: IIdentifierNode): TVoid; override; + function VisitKeyword(const Node: IKeywordNode): TVoid; override; // List Visitors - 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; - procedure VisitIfExpression(const Node: IIfExpressionNode); override; - procedure VisitTernaryExpression(const Node: ITernaryExpressionNode); override; - procedure VisitLambdaExpression(const Node: ILambdaExpressionNode); 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 VisitFunctionCall(const Node: IFunctionCallNode); override; - procedure VisitMacroExpansionNode(const Node: IMacroExpansionNode); override; - procedure VisitBlockExpression(const Node: IBlockExpressionNode); override; - procedure VisitVariableDeclaration(const Node: IVariableDeclarationNode); override; - procedure VisitAssignment(const Node: IAssignmentNode); 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 VisitRecurNode(const Node: IRecurNode); override; - procedure VisitNop(const Node: INopNode); override; + function VisitIfExpression(const Node: IIfExpressionNode): TVoid; override; + function VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid; override; + function VisitLambdaExpression(const Node: ILambdaExpressionNode): 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 VisitFunctionCall(const Node: IFunctionCallNode): TVoid; override; + function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid; override; + function VisitBlockExpression(const Node: IBlockExpressionNode): TVoid; override; + function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid; override; + function VisitAssignment(const Node: IAssignmentNode): 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 VisitRecurNode(const Node: IRecurNode): TVoid; override; + function VisitNop(const Node: INopNode): TVoid; override; end; // ----------------------------------------------------------------------------- @@ -851,7 +851,7 @@ begin Result := TDataValue.Void; end; -procedure TPrettyPrintVisitor.VisitConstant(const Node: IConstantNode); +function TPrettyPrintVisitor.VisitConstant(const Node: IConstantNode): TVoid; var val: TDataValue; begin @@ -862,19 +862,19 @@ begin Append(val.ToString); end; -procedure TPrettyPrintVisitor.VisitIdentifier(const Node: IIdentifierNode); +function TPrettyPrintVisitor.VisitIdentifier(const Node: IIdentifierNode): TVoid; begin Append(Node.Name); end; -procedure TPrettyPrintVisitor.VisitKeyword(const Node: IKeywordNode); +function TPrettyPrintVisitor.VisitKeyword(const Node: IKeywordNode): TVoid; begin Append(':' + Node.Value.Name); end; // --- List Visitors Implementation --- -procedure TPrettyPrintVisitor.VisitParameterList(const Node: IParameterList); +function TPrettyPrintVisitor.VisitParameterList(const Node: IParameterList): TVoid; begin Append('['); for var i := 0 to Node.Count - 1 do @@ -886,7 +886,7 @@ begin Append(']'); end; -procedure TPrettyPrintVisitor.VisitArgumentList(const Node: IArgumentList); +function TPrettyPrintVisitor.VisitArgumentList(const Node: IArgumentList): TVoid; begin // Argument list does not have brackets of its own in Lisp call syntax for var i := 0 to Node.Count - 1 do @@ -896,7 +896,7 @@ begin end; end; -procedure TPrettyPrintVisitor.VisitExpressionList(const Node: IExpressionList); +function TPrettyPrintVisitor.VisitExpressionList(const Node: IExpressionList): TVoid; begin Indent; for var item in Node do @@ -908,7 +908,7 @@ begin NewLine; end; -procedure TPrettyPrintVisitor.VisitRecordFieldList(const Node: IRecordFieldList); +function TPrettyPrintVisitor.VisitRecordFieldList(const Node: IRecordFieldList): TVoid; begin Indent; for var item in Node do @@ -920,7 +920,7 @@ begin NewLine; end; -procedure TPrettyPrintVisitor.VisitRecordField(const Node: IRecordFieldNode); +function TPrettyPrintVisitor.VisitRecordField(const Node: IRecordFieldNode): TVoid; begin Node.Key.Accept(Self); Append(' '); @@ -929,7 +929,7 @@ end; // --- Node Visitors --- -procedure TPrettyPrintVisitor.VisitIfExpression(const Node: IIfExpressionNode); +function TPrettyPrintVisitor.VisitIfExpression(const Node: IIfExpressionNode): TVoid; begin Append('(if '); Node.Condition.Accept(Self); @@ -946,7 +946,7 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode); +function TPrettyPrintVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid; begin Append('(? '); Node.Condition.Accept(Self); @@ -960,7 +960,7 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode); +function TPrettyPrintVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid; begin Append('(fn '); Node.Parameters.Accept(Self); @@ -972,7 +972,7 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode); +function TPrettyPrintVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid; begin Append('(defmacro '); Node.Name.Accept(Self); @@ -986,25 +986,25 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitQuasiquote(const Node: IQuasiquoteNode); +function TPrettyPrintVisitor.VisitQuasiquote(const Node: IQuasiquoteNode): TVoid; begin Append('`'); Node.Expression.Accept(Self); end; -procedure TPrettyPrintVisitor.VisitUnquote(const Node: IUnquoteNode); +function TPrettyPrintVisitor.VisitUnquote(const Node: IUnquoteNode): TVoid; begin Append('~'); Node.Expression.Accept(Self); end; -procedure TPrettyPrintVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); +function TPrettyPrintVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid; begin Append('~@'); Node.Expression.Accept(Self); end; -procedure TPrettyPrintVisitor.VisitFunctionCall(const Node: IFunctionCallNode); +function TPrettyPrintVisitor.VisitFunctionCall(const Node: IFunctionCallNode): TVoid; begin if (Node.Callee.Kind = akIdentifier) and (Node.Callee.AsIdentifier.Name = 'quote') and (Node.Arguments.Count = 1) then begin @@ -1019,26 +1019,26 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode); +function TPrettyPrintVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid; begin VisitFunctionCall(Node.CallNode); end; -procedure TPrettyPrintVisitor.VisitRecurNode(const Node: IRecurNode); +function TPrettyPrintVisitor.VisitRecurNode(const Node: IRecurNode): TVoid; begin Append('(recur'); Node.Arguments.Accept(Self); Append(')'); end; -procedure TPrettyPrintVisitor.VisitBlockExpression(const Node: IBlockExpressionNode); +function TPrettyPrintVisitor.VisitBlockExpression(const Node: IBlockExpressionNode): TVoid; begin Append('(do'); Node.Expressions.Accept(Self); Append(')'); end; -procedure TPrettyPrintVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode); +function TPrettyPrintVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid; begin Append('(def '); Node.Target.Accept(Self); @@ -1050,7 +1050,7 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitAssignment(const Node: IAssignmentNode); +function TPrettyPrintVisitor.VisitAssignment(const Node: IAssignmentNode): TVoid; begin Append('(assign '); Node.Target.Accept(Self); @@ -1059,7 +1059,7 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitIndexer(const Node: IIndexerNode); +function TPrettyPrintVisitor.VisitIndexer(const Node: IIndexerNode): TVoid; begin Append('(get '); Node.Base.Accept(Self); @@ -1068,7 +1068,7 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitMemberAccess(const Node: IMemberAccessNode); +function TPrettyPrintVisitor.VisitMemberAccess(const Node: IMemberAccessNode): TVoid; begin Append('(.'); Node.Member.Accept(Self); @@ -1077,7 +1077,7 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode); +function TPrettyPrintVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid; begin if Node.Fields.Count = 0 then begin @@ -1090,12 +1090,12 @@ begin Append('}'); end; -procedure TPrettyPrintVisitor.VisitCreateSeries(const Node: ICreateSeriesNode); +function TPrettyPrintVisitor.VisitCreateSeries(const Node: ICreateSeriesNode): TVoid; begin Append(Format('(new-series "%s")', [Node.Definition])); end; -procedure TPrettyPrintVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode); +function TPrettyPrintVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid; begin Append('(add-item '); Node.Series.Accept(Self); @@ -1109,12 +1109,12 @@ begin Append(')'); end; -procedure TPrettyPrintVisitor.VisitNop(const Node: INopNode); +function TPrettyPrintVisitor.VisitNop(const Node: INopNode): TVoid; begin Append('...'); end; -procedure TPrettyPrintVisitor.VisitSeriesLength(const Node: ISeriesLengthNode); +function TPrettyPrintVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): TVoid; begin Append('(count '); Node.Series.Accept(Self); diff --git a/Src/AST/Myc.Ast.Visitor.pas b/Src/AST/Myc.Ast.Visitor.pas index 4bf0c40..f61548d 100644 --- a/Src/AST/Myc.Ast.Visitor.pas +++ b/Src/AST/Myc.Ast.Visitor.pas @@ -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) @@ -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); + implementation { TAstVisitor } @@ -374,6 +281,191 @@ begin Result := TDataValue.FromGeneric(VisitNop(Node)); end; +// --- Default implementations (analogous to TAstVisitor) --- + +function TAstVisitor.VisitConstant(const Node: IConstantNode): T; +begin + Result := Default(T); +end; + +function TAstVisitor.VisitIdentifier(const Node: IIdentifierNode): T; +begin + Result := Default(T); +end; + +function TAstVisitor.VisitKeyword(const Node: IKeywordNode): T; +begin + Result := Default(T); +end; + +function TAstVisitor.VisitParameterList(const Node: IParameterList): T; +begin + Result := Default(T); + for var Item in Node do + Accept(Item); +end; + +function TAstVisitor.VisitArgumentList(const Node: IArgumentList): T; +begin + Result := Default(T); + for var Item in Node do + Accept(Item); +end; + +function TAstVisitor.VisitExpressionList(const Node: IExpressionList): T; +begin + Result := Default(T); + for var Item in Node do + Accept(Item); +end; + +function TAstVisitor.VisitRecordFieldList(const Node: IRecordFieldList): T; +begin + Result := Default(T); + for var Item in Node do + Accept(Item); +end; + +function TAstVisitor.VisitRecordField(const Node: IRecordFieldNode): T; +begin + Result := Default(T); + Accept(Node.Key); + Accept(Node.Value); +end; + +function TAstVisitor.VisitIfExpression(const Node: IIfExpressionNode): T; +begin + Result := Default(T); + Accept(Node.Condition); + Accept(Node.ThenBranch); + Accept(Node.ElseBranch); +end; + +function TAstVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): T; +begin + Result := Default(T); + Accept(Node.Condition); + Accept(Node.ThenBranch); + Accept(Node.ElseBranch); +end; + +function TAstVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode): T; +begin + Result := Default(T); + Accept(Node.Parameters); + Accept(Node.Body); +end; + +function TAstVisitor.VisitFunctionCall(const Node: IFunctionCallNode): T; +begin + Result := Default(T); + Accept(Node.Callee); + Accept(Node.Arguments); +end; + +function TAstVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode): T; +begin + Result := Default(T); + Accept(Node.CallNode); + Accept(Node.ExpandedBody); +end; + +function TAstVisitor.VisitBlockExpression(const Node: IBlockExpressionNode): T; +begin + Result := Default(T); + Accept(Node.Expressions); +end; + +function TAstVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): T; +begin + Result := Default(T); + Accept(Node.Target); + Accept(Node.Initializer); +end; + +function TAstVisitor.VisitAssignment(const Node: IAssignmentNode): T; +begin + Result := Default(T); + Accept(Node.Target); + Accept(Node.Value); +end; + +function TAstVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode): T; +begin + Result := Default(T); + Accept(Node.Name); + Accept(Node.Parameters); + Accept(Node.Body); +end; + +function TAstVisitor.VisitQuasiquote(const Node: IQuasiquoteNode): T; +begin + Result := Default(T); + Accept(Node.Expression); +end; + +function TAstVisitor.VisitUnquote(const Node: IUnquoteNode): T; +begin + Result := Default(T); + Accept(Node.Expression); +end; + +function TAstVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T; +begin + Result := Default(T); + Accept(Node.Expression); +end; + +function TAstVisitor.VisitIndexer(const Node: IIndexerNode): T; +begin + Result := Default(T); + Accept(Node.Base); + Accept(Node.Index); +end; + +function TAstVisitor.VisitMemberAccess(const Node: IMemberAccessNode): T; +begin + Result := Default(T); + Accept(Node.Base); + Accept(Node.Member); +end; + +function TAstVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode): T; +begin + Result := Default(T); + Accept(Node.Fields); +end; + +function TAstVisitor.VisitCreateSeries(const Node: ICreateSeriesNode): T; +begin + Result := Default(T); +end; + +function TAstVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode): T; +begin + Result := Default(T); + Accept(Node.Series); + Accept(Node.Value); + Accept(Node.Lookback); +end; + +function TAstVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): T; +begin + Result := Default(T); + Accept(Node.Series); +end; + +function TAstVisitor.VisitRecurNode(const Node: IRecurNode): T; +begin + Result := Default(T); + Accept(Node.Arguments); +end; + +function TAstVisitor.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. diff --git a/Src/AST/Myc.Fmx.AstEditor.pas b/Src/AST/Myc.Fmx.AstEditor.pas index b74f462..f9ec82a 100644 --- a/Src/AST/Myc.Fmx.AstEditor.pas +++ b/Src/AST/Myc.Fmx.AstEditor.pas @@ -37,7 +37,7 @@ type FMap: TNodeMap; procedure ApplyType(const Node: IAstNode); protected - procedure Accept(const Node: IAstNode); override; + function Accept(const Node: IAstNode): TVoid; override; public constructor Create(AMap: TNodeMap); end; @@ -968,7 +968,7 @@ begin end; end; -procedure TAstEditor.TTypePropagator.Accept(const Node: IAstNode); +function TAstEditor.TTypePropagator.Accept(const Node: IAstNode): TVoid; begin if Node = nil then exit;