Generic Visitors
This commit is contained in:
@@ -15,10 +15,11 @@ uses
|
||||
|
||||
type
|
||||
// Implementation of the Factory/Visitor for the Virtual Tree
|
||||
// Uses TAstVisitor<TAstViewNode> which now uses closures for dispatch.
|
||||
TAstVisualizer = class(TAstVisitor<TAstViewNode>, IAstVisualizer)
|
||||
private
|
||||
FExprDepth: Integer;
|
||||
FParentNode: TVisualNode; // Changed from TControl
|
||||
FParentNode: TVisualNode;
|
||||
FWorkspace: TWorkspace;
|
||||
|
||||
function CallAccept(const Node: IAstNode): TAstViewNode;
|
||||
@@ -29,49 +30,58 @@ type
|
||||
function GetWorkspace: TWorkspace;
|
||||
|
||||
protected
|
||||
// --- Visitor Implementations ---
|
||||
function VisitConstant(const Node: IConstantNode): TAstViewNode; override;
|
||||
function VisitIdentifier(const Node: IIdentifierNode): TAstViewNode; override;
|
||||
function VisitKeyword(const Node: IKeywordNode): TAstViewNode; override;
|
||||
// Setup registry using closures
|
||||
procedure SetupHandlers; override;
|
||||
|
||||
// --- Visitor Implementations (Strict IAstNode signature) ---
|
||||
function VisitConstant(const Node: IAstNode): TAstViewNode;
|
||||
function VisitIdentifier(const Node: IAstNode): TAstViewNode;
|
||||
function VisitKeyword(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
// Lists
|
||||
function VisitParameterList(const Node: IParameterList): TAstViewNode; override;
|
||||
function VisitArgumentList(const Node: IArgumentList): TAstViewNode; override;
|
||||
function VisitExpressionList(const Node: IExpressionList): TAstViewNode; override;
|
||||
function VisitRecordFieldList(const Node: IRecordFieldList): TAstViewNode; override;
|
||||
function VisitRecordField(const Node: IRecordFieldNode): TAstViewNode; override;
|
||||
function VisitParameterList(const Node: IAstNode): TAstViewNode;
|
||||
function VisitArgumentList(const Node: IAstNode): TAstViewNode;
|
||||
function VisitExpressionList(const Node: IAstNode): TAstViewNode;
|
||||
function VisitRecordFieldList(const Node: IAstNode): TAstViewNode;
|
||||
function VisitRecordField(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
// Control Flow
|
||||
function VisitIfExpression(const Node: IIfExpressionNode): TAstViewNode; override;
|
||||
function VisitCondExpression(const Node: ICondExpressionNode): TAstViewNode; override; // Replaces Ternary
|
||||
function VisitBlockExpression(const Node: IBlockExpressionNode): TAstViewNode; override;
|
||||
function VisitRecurNode(const Node: IRecurNode): TAstViewNode; override;
|
||||
function VisitNop(const Node: INopNode): TAstViewNode; override;
|
||||
function VisitIfExpression(const Node: IAstNode): TAstViewNode;
|
||||
function VisitCondExpression(const Node: IAstNode): TAstViewNode;
|
||||
function VisitBlockExpression(const Node: IAstNode): TAstViewNode;
|
||||
function VisitRecurNode(const Node: IAstNode): TAstViewNode;
|
||||
function VisitNop(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
// Functions
|
||||
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TAstViewNode; override;
|
||||
function VisitFunctionCall(const Node: IFunctionCallNode): TAstViewNode; override;
|
||||
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TAstViewNode; override;
|
||||
function VisitLambdaExpression(const Node: IAstNode): TAstViewNode;
|
||||
function VisitFunctionCall(const Node: IAstNode): TAstViewNode;
|
||||
function VisitMacroExpansionNode(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
// Declarations
|
||||
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstViewNode; override;
|
||||
function VisitAssignment(const Node: IAssignmentNode): TAstViewNode; override;
|
||||
function VisitMacroDefinition(const Node: IMacroDefinitionNode): TAstViewNode; override;
|
||||
function VisitVariableDeclaration(const Node: IAstNode): TAstViewNode;
|
||||
function VisitAssignment(const Node: IAstNode): TAstViewNode;
|
||||
function VisitMacroDefinition(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
// Metaprogramming
|
||||
function VisitQuasiquote(const Node: IQuasiquoteNode): TAstViewNode; override;
|
||||
function VisitUnquote(const Node: IUnquoteNode): TAstViewNode; override;
|
||||
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TAstViewNode; override;
|
||||
function VisitQuasiquote(const Node: IAstNode): TAstViewNode;
|
||||
function VisitUnquote(const Node: IAstNode): TAstViewNode;
|
||||
function VisitUnquoteSplicing(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
// Data Access
|
||||
function VisitIndexer(const Node: IIndexerNode): TAstViewNode; override;
|
||||
function VisitMemberAccess(const Node: IMemberAccessNode): TAstViewNode; override;
|
||||
function VisitRecordLiteral(const Node: IRecordLiteralNode): TAstViewNode; override;
|
||||
function VisitIndexer(const Node: IAstNode): TAstViewNode;
|
||||
function VisitMemberAccess(const Node: IAstNode): TAstViewNode;
|
||||
function VisitRecordLiteral(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
// Series
|
||||
function VisitCreateSeries(const Node: ICreateSeriesNode): TAstViewNode; override;
|
||||
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAstViewNode; override;
|
||||
function VisitSeriesLength(const Node: ISeriesLengthNode): TAstViewNode; override;
|
||||
function VisitCreateSeries(const Node: IAstNode): TAstViewNode;
|
||||
function VisitAddSeriesItem(const Node: IAstNode): TAstViewNode;
|
||||
function VisitSeriesLength(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
// Pipes
|
||||
function VisitPipeInput(const Node: IAstNode): TAstViewNode;
|
||||
function VisitPipeSelectorList(const Node: IAstNode): TAstViewNode;
|
||||
function VisitPipeInputList(const Node: IAstNode): TAstViewNode;
|
||||
function VisitPipe(const Node: IAstNode): TAstViewNode;
|
||||
|
||||
public
|
||||
constructor Create(AWorkspace: TWorkspace; AParentNode: TVisualNode; AExprDepth: Integer);
|
||||
@@ -87,42 +97,23 @@ type
|
||||
implementation
|
||||
|
||||
uses
|
||||
System.StrUtils,
|
||||
Myc.Fmx.AstEditor.Handlers,
|
||||
Myc.Fmx.AstEditor.Handlers.Data,
|
||||
Myc.Fmx.AstEditor.Handlers.Control,
|
||||
Myc.Fmx.AstEditor.Handlers.Primitives,
|
||||
Myc.Fmx.AstEditor.Handlers.Lists;
|
||||
|
||||
// Helper to identify standard operators
|
||||
function IsStandardOperator(const Name: string): Boolean;
|
||||
begin
|
||||
// You can extend this list based on your RTL
|
||||
Result :=
|
||||
(Name = '+')
|
||||
or (Name = '-')
|
||||
or (Name = '*')
|
||||
or (Name = '/')
|
||||
or (Name = 'div')
|
||||
or (Name = 'mod')
|
||||
or (Name = '=')
|
||||
or (Name = '<>')
|
||||
or (Name = '<')
|
||||
or (Name = '>')
|
||||
or (Name = '<=')
|
||||
or (Name = '>=')
|
||||
or (Name = 'and')
|
||||
or (Name = 'or')
|
||||
or (Name = 'xor')
|
||||
or (Name = 'not')
|
||||
or (Name = 'shl')
|
||||
or (Name = 'shr');
|
||||
Result := MatchStr(Name, ['+', '-', '*', '/', 'div', 'mod', '=', '<>', '<', '>', '<=', '>=', 'and', 'or', 'xor', 'not', 'shl', 'shr']);
|
||||
end;
|
||||
|
||||
{ TAstVisualizer }
|
||||
|
||||
constructor TAstVisualizer.Create(AWorkspace: TWorkspace; AParentNode: TVisualNode; AExprDepth: Integer);
|
||||
begin
|
||||
inherited Create;
|
||||
inherited Create; // Calls SetupHandlers
|
||||
FWorkspace := AWorkspace;
|
||||
FParentNode := AParentNode;
|
||||
FExprDepth := AExprDepth;
|
||||
@@ -133,6 +124,59 @@ begin
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TAstVisualizer.SetupHandlers;
|
||||
begin
|
||||
// Core Primitives
|
||||
Register(akConstant, VisitConstant);
|
||||
Register(akIdentifier, VisitIdentifier);
|
||||
Register(akKeyword, VisitKeyword);
|
||||
Register(akNop, VisitNop);
|
||||
|
||||
// Lists
|
||||
Register(akParameterList, VisitParameterList);
|
||||
Register(akArgumentList, VisitArgumentList);
|
||||
Register(akExpressionList, VisitExpressionList);
|
||||
Register(akRecordFieldList, VisitRecordFieldList);
|
||||
Register(akRecordField, VisitRecordField);
|
||||
|
||||
// Control Flow
|
||||
Register(akIfExpression, VisitIfExpression);
|
||||
Register(akCondExpression, VisitCondExpression);
|
||||
Register(akBlockExpression, VisitBlockExpression);
|
||||
Register(akRecur, VisitRecurNode);
|
||||
|
||||
// Functions
|
||||
Register(akLambdaExpression, VisitLambdaExpression);
|
||||
Register(akFunctionCall, VisitFunctionCall);
|
||||
Register(akMacroExpansion, VisitMacroExpansionNode);
|
||||
|
||||
// Declarations
|
||||
Register(akVariableDeclaration, VisitVariableDeclaration);
|
||||
Register(akAssignment, VisitAssignment);
|
||||
Register(akMacroDefinition, VisitMacroDefinition);
|
||||
|
||||
// Metaprogramming
|
||||
Register(akQuasiquote, VisitQuasiquote);
|
||||
Register(akUnquote, VisitUnquote);
|
||||
Register(akUnquoteSplicing, VisitUnquoteSplicing);
|
||||
|
||||
// Data Access
|
||||
Register(akIndexer, VisitIndexer);
|
||||
Register(akMemberAccess, VisitMemberAccess);
|
||||
Register(akRecordLiteral, VisitRecordLiteral);
|
||||
|
||||
// Series
|
||||
Register(akCreateSeries, VisitCreateSeries);
|
||||
Register(akAddSeriesItem, VisitAddSeriesItem);
|
||||
Register(akSeriesLength, VisitSeriesLength);
|
||||
|
||||
// Pipes
|
||||
Register(akPipeInput, VisitPipeInput);
|
||||
Register(akPipeSelectorList, VisitPipeSelectorList);
|
||||
Register(akPipeInputList, VisitPipeInputList);
|
||||
Register(akPipe, VisitPipe);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.CallAccept(const Node: IAstNode): TAstViewNode;
|
||||
var
|
||||
dataValue: TDataValue;
|
||||
@@ -140,10 +184,9 @@ begin
|
||||
if not Assigned(Node) then
|
||||
exit(nil);
|
||||
|
||||
// Dynamic dispatch via Visitor pattern
|
||||
dataValue := Node.Accept(Self);
|
||||
|
||||
if dataValue.Kind = TDataValueKind.vkGeneric then
|
||||
if dataValue.Kind = vkGeneric then
|
||||
Result := dataValue.AsGeneric<TAstViewNode>
|
||||
else
|
||||
Result := nil;
|
||||
@@ -169,180 +212,203 @@ begin
|
||||
Result := FWorkspace;
|
||||
end;
|
||||
|
||||
// --- Visitor Implementation Helpers ---
|
||||
// --- Visitor Implementations (Cast-heavy for efficiency) ---
|
||||
|
||||
function TAstVisualizer.VisitConstant(const Node: IConstantNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitConstant(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TConstantNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TConstantNodeHandler.Create(Node.AsConstant));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitIdentifier(const Node: IIdentifierNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitIdentifier(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TIdentifierNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TIdentifierNodeHandler.Create(Node.AsIdentifier));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitKeyword(const Node: IKeywordNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitKeyword(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TKeywordNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TKeywordNodeHandler.Create(Node.AsKeyword));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitNop(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TNopNodeHandler.Create(Node.AsNop));
|
||||
end;
|
||||
|
||||
// Lists
|
||||
|
||||
function TAstVisualizer.VisitParameterList(const Node: IParameterList): TAstViewNode;
|
||||
function TAstVisualizer.VisitParameterList(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TParameterListHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TParameterListHandler.Create(Node.AsParameterList));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitArgumentList(const Node: IArgumentList): TAstViewNode;
|
||||
function TAstVisualizer.VisitArgumentList(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TArgumentListHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TArgumentListHandler.Create(Node.AsArgumentList));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitExpressionList(const Node: IExpressionList): TAstViewNode;
|
||||
function TAstVisualizer.VisitExpressionList(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TExpressionListHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TExpressionListHandler.Create(Node.AsExpressionList));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitRecordFieldList(const Node: IRecordFieldList): TAstViewNode;
|
||||
function TAstVisualizer.VisitRecordFieldList(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TRecordFieldListHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TRecordFieldListHandler.Create(Node.AsRecordFieldList));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitRecordField(const Node: IRecordFieldNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitRecordField(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TRecordFieldHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TRecordFieldHandler.Create(Node.AsRecordField));
|
||||
end;
|
||||
|
||||
// Control Flow
|
||||
|
||||
function TAstVisualizer.VisitBlockExpression(const Node: IBlockExpressionNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitBlockExpression(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TBlockExpressionNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TBlockExpressionNodeHandler.Create(Node.AsBlockExpression));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitIfExpression(const Node: IIfExpressionNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitIfExpression(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TIfExpressionNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TIfExpressionNodeHandler.Create(Node.AsIfExpression));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitCondExpression(const Node: ICondExpressionNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitCondExpression(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TCondExpressionNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TCondExpressionNodeHandler.Create(Node.AsCondExpression));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitRecurNode(const Node: IRecurNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitRecurNode(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TRecurNodeHandler.Create(Node));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitNop(const Node: INopNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TNopNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TRecurNodeHandler.Create(Node.AsRecur));
|
||||
end;
|
||||
|
||||
// Functions
|
||||
|
||||
function TAstVisualizer.VisitLambdaExpression(const Node: ILambdaExpressionNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitLambdaExpression(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TLambdaExpressionNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TLambdaExpressionNodeHandler.Create(Node.AsLambdaExpression));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitFunctionCall(const Node: IFunctionCallNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitFunctionCall(const Node: IAstNode): TAstViewNode;
|
||||
var
|
||||
C: IFunctionCallNode;
|
||||
calleeName: string;
|
||||
isOp: Boolean;
|
||||
begin
|
||||
C := Node.AsFunctionCall;
|
||||
isOp := False;
|
||||
|
||||
// Check if callee is a simple identifier or keyword that matches an operator
|
||||
if Node.Callee.Kind = akIdentifier then
|
||||
if C.Callee.Kind = akIdentifier then
|
||||
begin
|
||||
calleeName := Node.Callee.AsIdentifier.Name;
|
||||
calleeName := C.Callee.AsIdentifier.Name;
|
||||
isOp := IsStandardOperator(calleeName);
|
||||
end
|
||||
else if Node.Callee.Kind = akKeyword then
|
||||
else if C.Callee.Kind = akKeyword then
|
||||
begin
|
||||
calleeName := Node.Callee.AsKeyword.Value.Name;
|
||||
calleeName := C.Callee.AsKeyword.Value.Name;
|
||||
isOp := IsStandardOperator(calleeName);
|
||||
end;
|
||||
|
||||
if isOp then
|
||||
Result := TAstViewNode.Create(Self, TOperatorCallHandler.Create(Node))
|
||||
Result := TAstViewNode.Create(Self, TOperatorCallHandler.Create(C))
|
||||
else
|
||||
Result := TAstViewNode.Create(Self, TFunctionCallNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TFunctionCallNodeHandler.Create(C));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitMacroExpansionNode(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TMacroExpansionNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TMacroExpansionNodeHandler.Create(Node.AsMacroExpansion));
|
||||
end;
|
||||
|
||||
// Declarations
|
||||
|
||||
function TAstVisualizer.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitVariableDeclaration(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TVariableDeclarationNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TVariableDeclarationNodeHandler.Create(Node.AsVariableDeclaration));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitAssignment(const Node: IAssignmentNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitAssignment(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TAssignmentNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TAssignmentNodeHandler.Create(Node.AsAssignment));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitMacroDefinition(const Node: IMacroDefinitionNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitMacroDefinition(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TMacroDefinitionNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TMacroDefinitionNodeHandler.Create(Node.AsMacroDefinition));
|
||||
end;
|
||||
|
||||
// Metaprogramming
|
||||
|
||||
function TAstVisualizer.VisitQuasiquote(const Node: IQuasiquoteNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitQuasiquote(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TQuasiquoteNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TQuasiquoteNodeHandler.Create(Node.AsQuasiquote));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitUnquote(const Node: IUnquoteNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitUnquote(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TUnquoteNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TUnquoteNodeHandler.Create(Node.AsUnquote));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitUnquoteSplicing(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TUnquoteSplicingNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TUnquoteSplicingNodeHandler.Create(Node.AsUnquoteSplicing));
|
||||
end;
|
||||
|
||||
// Data Access
|
||||
|
||||
function TAstVisualizer.VisitIndexer(const Node: IIndexerNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitIndexer(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TIndexerNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TIndexerNodeHandler.Create(Node.AsIndexer));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitMemberAccess(const Node: IMemberAccessNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitMemberAccess(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TMemberAccessNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TMemberAccessNodeHandler.Create(Node.AsMemberAccess));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitRecordLiteral(const Node: IRecordLiteralNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitRecordLiteral(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TRecordLiteralNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TRecordLiteralNodeHandler.Create(Node.AsRecordLiteral));
|
||||
end;
|
||||
|
||||
// Series
|
||||
|
||||
function TAstVisualizer.VisitCreateSeries(const Node: ICreateSeriesNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitCreateSeries(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TCreateSeriesNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TCreateSeriesNodeHandler.Create(Node.AsCreateSeries));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitAddSeriesItem(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TAddSeriesItemNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TAddSeriesItemNodeHandler.Create(Node.AsAddSeriesItem));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitSeriesLength(const Node: ISeriesLengthNode): TAstViewNode;
|
||||
function TAstVisualizer.VisitSeriesLength(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TSeriesLengthNodeHandler.Create(Node));
|
||||
Result := TAstViewNode.Create(Self, TSeriesLengthNodeHandler.Create(Node.AsSeriesLength));
|
||||
end;
|
||||
|
||||
// Pipes (Fallback to Nop/Placeholder visualization until specific handlers are implemented)
|
||||
|
||||
function TAstVisualizer.VisitPipeInput(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TNopNodeHandler.Create(Node.AsNop));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitPipeSelectorList(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TNopNodeHandler.Create(Node.AsNop));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitPipeInputList(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TNopNodeHandler.Create(Node.AsNop));
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitPipe(const Node: IAstNode): TAstViewNode;
|
||||
begin
|
||||
Result := TAstViewNode.Create(Self, TNopNodeHandler.Create(Node.AsNop));
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user