Static specialization WIP
This commit is contained in:
@@ -80,8 +80,6 @@ type
|
||||
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;
|
||||
@@ -279,19 +277,6 @@ type
|
||||
function ReconstructAst(OwnerNode: TAuraNode): IAstNode;
|
||||
end;
|
||||
|
||||
{ TAuraBinaryExpressionNode }
|
||||
TBinaryExpressionNodeHandler = class(TInterfacedObject, IAuraNodeHandler)
|
||||
private
|
||||
FNode: IBinaryExpressionNode;
|
||||
FLeftNode: TAuraNode; // Stores the visual child
|
||||
FRightNode: TAuraNode; // Stores the visual child
|
||||
function GetAstNode: IAstNode;
|
||||
public
|
||||
constructor Create(const ANode: IBinaryExpressionNode);
|
||||
procedure BuildUI(OwnerNode: TAuraNode);
|
||||
function ReconstructAst(OwnerNode: TAuraNode): IAstNode;
|
||||
end;
|
||||
|
||||
{ TAuraBlockExpressionNode }
|
||||
TBlockExpressionNodeHandler = class(TInterfacedObject, IAuraNodeHandler)
|
||||
private
|
||||
@@ -305,18 +290,6 @@ type
|
||||
function ReconstructAst(OwnerNode: TAuraNode): IAstNode;
|
||||
end;
|
||||
|
||||
{ TAuraUnaryExpressionNode }
|
||||
TUnaryExpressionNodeHandler = class(TInterfacedObject, IAuraNodeHandler)
|
||||
private
|
||||
FNode: IUnaryExpressionNode;
|
||||
FChildNode: TAuraNode; // Stores the single child
|
||||
function GetAstNode: IAstNode;
|
||||
public
|
||||
constructor Create(const ANode: IUnaryExpressionNode);
|
||||
procedure BuildUI(OwnerNode: TAuraNode);
|
||||
function ReconstructAst(OwnerNode: TAuraNode): IAstNode;
|
||||
end;
|
||||
|
||||
{ TAuraIfExpressionNode }
|
||||
TIfExpressionNodeHandler = class(TInterfacedObject, IAuraNodeHandler)
|
||||
private
|
||||
@@ -648,14 +621,6 @@ begin
|
||||
Result := TAuraNode.Create(Self, Handler);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitBinaryExpression(const Node: IBinaryExpressionNode): TAuraNode;
|
||||
var
|
||||
Handler: IAuraNodeHandler;
|
||||
begin
|
||||
Handler := TBinaryExpressionNodeHandler.Create(Node);
|
||||
Result := TAuraNode.Create(Self, Handler);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitBlockExpression(const Node: IBlockExpressionNode): TAuraNode;
|
||||
var
|
||||
Handler: IAuraNodeHandler;
|
||||
@@ -664,14 +629,6 @@ begin
|
||||
Result := TAuraNode.Create(Self, Handler);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitUnaryExpression(const Node: IUnaryExpressionNode): TAuraNode;
|
||||
var
|
||||
Handler: IAuraNodeHandler;
|
||||
begin
|
||||
Handler := TUnaryExpressionNodeHandler.Create(Node);
|
||||
Result := TAuraNode.Create(Self, Handler);
|
||||
end;
|
||||
|
||||
function TAstVisualizer.VisitIfExpression(const Node: IIfExpressionNode): TAuraNode;
|
||||
var
|
||||
Handler: IAuraNodeHandler;
|
||||
@@ -1404,44 +1361,6 @@ begin
|
||||
Result := FNode; // Keywords are literals
|
||||
end;
|
||||
|
||||
{ TBinaryExpressionNodeHandler }
|
||||
|
||||
constructor TBinaryExpressionNodeHandler.Create(const ANode: IBinaryExpressionNode);
|
||||
begin
|
||||
inherited Create;
|
||||
FNode := ANode;
|
||||
end;
|
||||
|
||||
function TBinaryExpressionNodeHandler.GetAstNode: IAstNode;
|
||||
begin
|
||||
Result := FNode;
|
||||
end;
|
||||
|
||||
procedure TBinaryExpressionNodeHandler.BuildUI(OwnerNode: TAuraNode);
|
||||
var
|
||||
visu: IAstVisualizer;
|
||||
begin
|
||||
visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
|
||||
OwnerNode.BeginUpdate;
|
||||
try
|
||||
OwnerNode.Frameless := true;
|
||||
OwnerNode.Orientation := loHorizontal;
|
||||
|
||||
// Create and store visual children
|
||||
FLeftNode := visu.CallAccept(FNode.Left);
|
||||
OwnerNode.AddLabel(OwnerNode, FNode.Operator.ToString);
|
||||
FRightNode := visu.CallAccept(FNode.Right);
|
||||
finally
|
||||
OwnerNode.EndUpdate;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TBinaryExpressionNodeHandler.ReconstructAst(OwnerNode: TAuraNode): IAstNode;
|
||||
begin
|
||||
// Use the stored visual children to reconstruct the AST
|
||||
Result := TAst.BinaryExpr(FLeftNode.CreateAst, FNode.Operator, FRightNode.CreateAst);
|
||||
end;
|
||||
|
||||
{ TBlockExpressionNodeHandler }
|
||||
|
||||
constructor TBlockExpressionNodeHandler.Create(const ANode: IBlockExpressionNode);
|
||||
@@ -1521,42 +1440,6 @@ begin
|
||||
Result := TAst.Block(exprs);
|
||||
end;
|
||||
|
||||
{ TUnaryExpressionNodeHandler }
|
||||
|
||||
constructor TUnaryExpressionNodeHandler.Create(const ANode: IUnaryExpressionNode);
|
||||
begin
|
||||
inherited Create;
|
||||
FNode := ANode;
|
||||
end;
|
||||
|
||||
function TUnaryExpressionNodeHandler.GetAstNode: IAstNode;
|
||||
begin
|
||||
Result := FNode;
|
||||
end;
|
||||
|
||||
procedure TUnaryExpressionNodeHandler.BuildUI(OwnerNode: TAuraNode);
|
||||
var
|
||||
visu: IAstVisualizer;
|
||||
titleLabel: TLabel;
|
||||
begin
|
||||
visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
|
||||
OwnerNode.BeginUpdate;
|
||||
try
|
||||
OwnerNode.Frameless := False;
|
||||
OwnerNode.Orientation := loVertical;
|
||||
titleLabel := OwnerNode.AddLabel(OwnerNode, 'Unary Op: ' + FNode.Operator.ToString);
|
||||
titleLabel.Font.Style := titleLabel.Font.Style + [TFontStyle.fsBold];
|
||||
FChildNode := visu.CallAccept(FNode.Right);
|
||||
finally
|
||||
OwnerNode.EndUpdate;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TUnaryExpressionNodeHandler.ReconstructAst(OwnerNode: TAuraNode): IAstNode;
|
||||
begin
|
||||
Result := TAst.UnaryExpr(FNode.Operator, FChildNode.CreateAst);
|
||||
end;
|
||||
|
||||
{ TIfExpressionNodeHandler }
|
||||
|
||||
constructor TIfExpressionNodeHandler.Create(const ANode: IIfExpressionNode);
|
||||
|
||||
Reference in New Issue
Block a user