Imutability for macro nodes
This commit is contained in:
+20
-15
@@ -276,9 +276,9 @@ type
|
||||
constructor Create(const AName: IIdentifierNode; const AParameters: TArray<IIdentifierNode>; const ABody: IAstNode);
|
||||
function Accept(const Visitor: IAstVisitor): TDataValue; override;
|
||||
function AsMacroDefinition: IMacroDefinitionNode; override;
|
||||
property Name: IIdentifierNode read GetName write FName; // Writeable
|
||||
property Parameters: TArray<IIdentifierNode> read FParameters write FParameters;
|
||||
property Body: IAstNode read FBody write FBody; // Writeable
|
||||
property Name: IIdentifierNode read GetName;
|
||||
property Parameters: TArray<IIdentifierNode> read FParameters;
|
||||
property Body: IAstNode read FBody;
|
||||
end;
|
||||
|
||||
TQuasiquoteNode = class(TAstNode, IQuasiquoteNode)
|
||||
@@ -290,7 +290,7 @@ type
|
||||
constructor Create(const AExpression: IAstNode);
|
||||
function Accept(const Visitor: IAstVisitor): TDataValue; override;
|
||||
function AsQuasiquote: IQuasiquoteNode; override;
|
||||
property Expression: IAstNode read GetExpression write FExpression; // Writeable
|
||||
property Expression: IAstNode read GetExpression;
|
||||
end;
|
||||
|
||||
TUnquoteNode = class(TAstNode, IUnquoteNode)
|
||||
@@ -302,7 +302,7 @@ type
|
||||
constructor Create(const AExpression: IAstNode);
|
||||
function Accept(const Visitor: IAstVisitor): TDataValue; override;
|
||||
function AsUnquote: IUnquoteNode; override;
|
||||
property Expression: IAstNode read GetExpression write FExpression; // Writeable
|
||||
property Expression: IAstNode read GetExpression;
|
||||
end;
|
||||
|
||||
TUnquoteSplicingNode = class(TAstNode, IUnquoteSplicingNode)
|
||||
@@ -314,7 +314,7 @@ type
|
||||
constructor Create(const AExpression: IQuasiquoteNode);
|
||||
function Accept(const Visitor: IAstVisitor): TDataValue; override;
|
||||
function AsUnquoteSplicing: IUnquoteSplicingNode; override;
|
||||
property Expression: IQuasiquoteNode read GetExpression write FExpression;
|
||||
property Expression: IQuasiquoteNode read GetExpression;
|
||||
end;
|
||||
|
||||
TFunctionCallNode = class(TAstTypedNode, IFunctionCallNode)
|
||||
@@ -346,16 +346,19 @@ type
|
||||
property Arguments: TArray<IAstNode> read FArguments write FArguments; // Writeable
|
||||
end;
|
||||
|
||||
TMacroExpansionNode = class(TFunctionCallNode, IMacroExpansionNode)
|
||||
TMacroExpansionNode = class(TAstTypedNode, IMacroExpansionNode)
|
||||
private
|
||||
FCallNode: IFunctionCallNode;
|
||||
FExpandedBody: IAstNode;
|
||||
function GetCallNode: IFunctionCallNode;
|
||||
function GetExpandedBody: IAstNode;
|
||||
function GetKind: TAstNodeKind; override;
|
||||
public
|
||||
constructor Create(const AOriginalCallNode: IFunctionCallNode; const AExpandedBody: IAstNode; const AStaticType: IStaticType);
|
||||
constructor Create(const ACallNode: IFunctionCallNode; const AExpandedBody: IAstNode; const AStaticType: IStaticType);
|
||||
function Accept(const Visitor: IAstVisitor): TDataValue; override;
|
||||
function AsMacroExpansion: IMacroExpansionNode; override;
|
||||
property ExpandedBody: IAstNode read FExpandedBody write FExpandedBody; // Writeable
|
||||
property CallNode: IFunctionCallNode read GetCallNode;
|
||||
property ExpandedBody: IAstNode read FExpandedBody;
|
||||
end;
|
||||
|
||||
TBlockExpressionNode = class(TAstTypedNode, IBlockExpressionNode)
|
||||
@@ -1331,15 +1334,12 @@ end;
|
||||
|
||||
{ TMacroExpansionNode }
|
||||
|
||||
constructor TMacroExpansionNode.Create(
|
||||
const AOriginalCallNode: IFunctionCallNode;
|
||||
const AExpandedBody: IAstNode;
|
||||
const AStaticType: IStaticType
|
||||
);
|
||||
constructor TMacroExpansionNode.Create(const ACallNode: IFunctionCallNode; const AExpandedBody: IAstNode; const AStaticType: IStaticType);
|
||||
begin
|
||||
// Copy properties from the original call node
|
||||
inherited Create(AOriginalCallNode.Callee, AOriginalCallNode.Arguments, AStaticType);
|
||||
inherited Create(AStaticType);
|
||||
FExpandedBody := AExpandedBody;
|
||||
FCallNode := ACallNode;
|
||||
end;
|
||||
|
||||
function TMacroExpansionNode.Accept(const Visitor: IAstVisitor): TDataValue;
|
||||
@@ -1352,6 +1352,11 @@ begin
|
||||
Result := Self;
|
||||
end;
|
||||
|
||||
function TMacroExpansionNode.GetCallNode: IFunctionCallNode;
|
||||
begin
|
||||
Result := FCallNode;
|
||||
end;
|
||||
|
||||
function TMacroExpansionNode.GetExpandedBody: IAstNode;
|
||||
begin
|
||||
Result := FExpandedBody;
|
||||
|
||||
Reference in New Issue
Block a user