Binder refactoring, Monster refactoring
This commit is contained in:
@@ -49,7 +49,8 @@ type
|
||||
property Workspace: TAuraWorkspace read GetWorkspace;
|
||||
end;
|
||||
|
||||
TAstVisualizer = class(TAstVisitor, IAstVisualizer)
|
||||
// Inherits from the new generic TAstVisitor<TAuraNode>
|
||||
TAstVisualizer = class(TAstVisitor<TAuraNode>, IAstVisualizer)
|
||||
private
|
||||
FExprDepth: Integer;
|
||||
FParentControl: TControl;
|
||||
@@ -63,30 +64,30 @@ type
|
||||
procedure SetParentControl(const Value: TControl);
|
||||
protected
|
||||
// Visitor implementations for each AST node type.
|
||||
function VisitConstant(const Node: IConstantNode): TDataValue; override;
|
||||
function VisitIdentifier(const Node: IIdentifierNode): TDataValue; override;
|
||||
function VisitKeyword(const Node: IKeywordNode): TDataValue; override;
|
||||
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue; override;
|
||||
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue; override;
|
||||
function VisitIfExpression(const Node: IIfExpressionNode): TDataValue; override;
|
||||
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue; override;
|
||||
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue; override;
|
||||
function VisitFunctionCall(const Node: IFunctionCallNode): TDataValue; override;
|
||||
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TDataValue; override;
|
||||
function VisitBlockExpression(const Node: IBlockExpressionNode): TDataValue; override;
|
||||
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue; override;
|
||||
function VisitAssignment(const Node: IAssignmentNode): TDataValue; override;
|
||||
function VisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue; override;
|
||||
function VisitQuasiquote(const Node: IQuasiquoteNode): TDataValue; override;
|
||||
function VisitUnquote(const Node: IUnquoteNode): TDataValue; override;
|
||||
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue; override;
|
||||
function VisitIndexer(const Node: IIndexerNode): TDataValue; override;
|
||||
function VisitMemberAccess(const Node: IMemberAccessNode): TDataValue; override;
|
||||
function VisitRecordLiteral(const Node: IRecordLiteralNode): TDataValue; override;
|
||||
function VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue; override;
|
||||
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue; override;
|
||||
function VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue; override;
|
||||
function VisitRecurNode(const Node: IRecurNode): TDataValue; override;
|
||||
function VisitConstant(const Node: IConstantNode): TAuraNode; override;
|
||||
function VisitIdentifier(const Node: IIdentifierNode): TAuraNode; override;
|
||||
function VisitKeyword(const Node: IKeywordNode): TAuraNode; override;
|
||||
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TAuraNode; override;
|
||||
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TAuraNode; override;
|
||||
function VisitIfExpression(const Node: IIfExpressionNode): TAuraNode; override;
|
||||
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TAuraNode; override;
|
||||
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TAuraNode; override;
|
||||
function VisitFunctionCall(const Node: IFunctionCallNode): TAuraNode; override;
|
||||
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TAuraNode; override;
|
||||
function VisitBlockExpression(const Node: IBlockExpressionNode): TAuraNode; override;
|
||||
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAuraNode; override;
|
||||
function VisitAssignment(const Node: IAssignmentNode): TAuraNode; override;
|
||||
function VisitMacroDefinition(const Node: IMacroDefinitionNode): TAuraNode; override;
|
||||
function VisitQuasiquote(const Node: IQuasiquoteNode): TAuraNode; override;
|
||||
function VisitUnquote(const Node: IUnquoteNode): TAuraNode; override;
|
||||
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TAuraNode; override;
|
||||
function VisitIndexer(const Node: IIndexerNode): TAuraNode; override;
|
||||
function VisitMemberAccess(const Node: IMemberAccessNode): TAuraNode; override;
|
||||
function VisitRecordLiteral(const Node: IRecordLiteralNode): TAuraNode; override;
|
||||
function VisitCreateSeries(const Node: ICreateSeriesNode): TAuraNode; override;
|
||||
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAuraNode; override;
|
||||
function VisitSeriesLength(const Node: ISeriesLengthNode): TAuraNode; override;
|
||||
function VisitRecurNode(const Node: IRecurNode): TAuraNode; override;
|
||||
|
||||
public
|
||||
constructor Create(AWorkspace: TAuraWorkspace; AParentControl: TControl; AExprDepth: Integer);
|
||||
@@ -593,126 +594,126 @@ begin
|
||||
FParentControl := Value;
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
|
||||
function TAstVisualizer.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraAddSeriesItemNode.Create(Self, Node));
|
||||
Result := TAuraAddSeriesItemNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitAssignment(const Node: IAssignmentNode): TDataValue;
|
||||
function TAstVisualizer.VisitAssignment(const Node: IAssignmentNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraAssignmentNode.Create(Self, Node));
|
||||
Result := TAuraAssignmentNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
// --- Visitor Implementations ---
|
||||
|
||||
function TAstVisualizer.VisitConstant(const Node: IConstantNode): TDataValue;
|
||||
function TAstVisualizer.VisitConstant(const Node: IConstantNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraConstantNode.Create(Self, Node));
|
||||
Result := TAuraConstantNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitIdentifier(const Node: IIdentifierNode): TDataValue;
|
||||
function TAstVisualizer.VisitIdentifier(const Node: IIdentifierNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraIdentifierNode.Create(Self, Node));
|
||||
Result := TAuraIdentifierNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitKeyword(const Node: IKeywordNode): TDataValue;
|
||||
function TAstVisualizer.VisitKeyword(const Node: IKeywordNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraKeywordNode.Create(Self, Node));
|
||||
Result := TAuraKeywordNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
|
||||
function TAstVisualizer.VisitBinaryExpression(const Node: IBinaryExpressionNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraBinaryExpressionNode.Create(Self, Node));
|
||||
Result := TAuraBinaryExpressionNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
|
||||
function TAstVisualizer.VisitBlockExpression(const Node: IBlockExpressionNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraBlockExpressionNode.Create(Self, Node));
|
||||
Result := TAuraBlockExpressionNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
|
||||
function TAstVisualizer.VisitCreateSeries(const Node: ICreateSeriesNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraCreateSeriesNode.Create(Self, Node));
|
||||
Result := TAuraCreateSeriesNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
|
||||
function TAstVisualizer.VisitFunctionCall(const Node: IFunctionCallNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraFunctionCallNode.Create(Self, Node));
|
||||
Result := TAuraFunctionCallNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue;
|
||||
function TAstVisualizer.VisitUnaryExpression(const Node: IUnaryExpressionNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraUnaryExpressionNode.Create(Self, Node));
|
||||
Result := TAuraUnaryExpressionNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitIfExpression(const Node: IIfExpressionNode): TDataValue;
|
||||
function TAstVisualizer.VisitIfExpression(const Node: IIfExpressionNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraIfExpressionNode.Create(Self, Node));
|
||||
Result := TAuraIfExpressionNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitIndexer(const Node: IIndexerNode): TDataValue;
|
||||
function TAstVisualizer.VisitIndexer(const Node: IIndexerNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraIndexerNode.Create(Self, Node));
|
||||
Result := TAuraIndexerNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
|
||||
function TAstVisualizer.VisitLambdaExpression(const Node: ILambdaExpressionNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraLambdaExpressionNode.Create(Self, Node));
|
||||
Result := TAuraLambdaExpressionNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue;
|
||||
function TAstVisualizer.VisitMacroDefinition(const Node: IMacroDefinitionNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraMacroDefinitionNode.Create(Self, Node));
|
||||
Result := TAuraMacroDefinitionNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TDataValue;
|
||||
function TAstVisualizer.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraMacroExpansionNode.Create(Self, Node));
|
||||
Result := TAuraMacroExpansionNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
|
||||
function TAstVisualizer.VisitMemberAccess(const Node: IMemberAccessNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraMemberAccessNode.Create(Self, Node));
|
||||
Result := TAuraMemberAccessNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitRecordLiteral(const Node: IRecordLiteralNode): TDataValue;
|
||||
function TAstVisualizer.VisitRecordLiteral(const Node: IRecordLiteralNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraRecordLiteralNode.Create(Self, Node));
|
||||
Result := TAuraRecordLiteralNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitQuasiquote(const Node: IQuasiquoteNode): TDataValue;
|
||||
function TAstVisualizer.VisitQuasiquote(const Node: IQuasiquoteNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraQuasiquoteNode.Create(Self, Node));
|
||||
Result := TAuraQuasiquoteNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitRecurNode(const Node: IRecurNode): TDataValue;
|
||||
function TAstVisualizer.VisitRecurNode(const Node: IRecurNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraRecurNode.Create(Self, Node));
|
||||
Result := TAuraRecurNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
|
||||
function TAstVisualizer.VisitSeriesLength(const Node: ISeriesLengthNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraSeriesLengthNode.Create(Self, Node));
|
||||
Result := TAuraSeriesLengthNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
|
||||
function TAstVisualizer.VisitTernaryExpression(const Node: ITernaryExpressionNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraTernaryExpressionNode.Create(Self, Node));
|
||||
Result := TAuraTernaryExpressionNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitUnquote(const Node: IUnquoteNode): TDataValue;
|
||||
function TAstVisualizer.VisitUnquote(const Node: IUnquoteNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraUnquoteNode.Create(Self, Node));
|
||||
Result := TAuraUnquoteNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue;
|
||||
function TAstVisualizer.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraUnquoteSplicingNode.Create(Self, Node));
|
||||
Result := TAuraUnquoteSplicingNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
|
||||
function TAstVisualizer.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAuraNode;
|
||||
begin
|
||||
Result := TDataValue.FromGeneric<TAuraNode>(TAuraVariableDeclarationNode.Create(Self, Node));
|
||||
Result := TAuraVariableDeclarationNode.Create(Self, Node);
|
||||
end;
|
||||
|
||||
{ TAutoFitControl }
|
||||
@@ -1517,16 +1518,8 @@ begin
|
||||
end;
|
||||
|
||||
function TAuraLambdaExpressionNode.CreateAst: IAstNode;
|
||||
var
|
||||
params: TArray<IIdentifierNode>;
|
||||
i: Integer;
|
||||
begin
|
||||
// Re-use FNode.Parameters which is the source of truth
|
||||
SetLength(params, Length(FNode.Parameters));
|
||||
for i := 0 to High(FNode.Parameters) do
|
||||
params[i] := TAst.Identifier(FNode.Parameters[i].Name);
|
||||
|
||||
Result := TAst.LambdaExpr(params, FBodyNode.CreateAst);
|
||||
Result := TAst.LambdaExpr(FNode.Parameters, FBodyNode.CreateAst);
|
||||
end;
|
||||
|
||||
procedure TAuraLambdaExpressionNode.SetupNode;
|
||||
@@ -1966,7 +1959,7 @@ end;
|
||||
|
||||
function TAuraUnquoteSplicingNode.CreateAst: IAstNode;
|
||||
begin
|
||||
Result := TAst.UnquoteSplicing(FExpressionNode.CreateAst);
|
||||
Result := TAst.UnquoteSplicing(FExpressionNode.CreateAst.AsQuasiquote);
|
||||
end;
|
||||
|
||||
procedure TAuraUnquoteSplicingNode.SetupNode;
|
||||
|
||||
Reference in New Issue
Block a user