This commit is contained in:
Michael Schimmel
2025-10-30 18:00:58 +01:00
parent dfe1f04333
commit 798aa08f02
12 changed files with 710 additions and 27 deletions
+34
View File
@@ -15,6 +15,7 @@ type
protected
function VisitConstant(const Node: IConstantNode): TDataValue; virtual; abstract;
function VisitIdentifier(const Node: IIdentifierNode): TDataValue; virtual; abstract;
function VisitKeyword(const Node: IKeywordNode): TDataValue; virtual; abstract;
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue; virtual; abstract;
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue; virtual; abstract;
function VisitIfExpression(const Node: IIfExpressionNode): TDataValue; virtual; abstract;
@@ -31,6 +32,7 @@ type
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue; virtual; abstract;
function VisitIndexer(const Node: IIndexerNode): TDataValue; virtual; abstract;
function VisitMemberAccess(const Node: IMemberAccessNode): TDataValue; virtual; abstract;
function VisitRecordLiteral(const Node: IRecordLiteralNode): TDataValue; virtual; abstract;
function VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue; virtual; abstract;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue; virtual; abstract;
function VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue; virtual; abstract;
@@ -51,6 +53,7 @@ type
// These virtual methods implement the default identity-transformation (cloning) behavior.
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;
@@ -67,6 +70,7 @@ type
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;
@@ -126,6 +130,12 @@ begin
Result := TDataValue.FromIntf<IIdentifierNode>(Node);
end;
function TAstTransformer.VisitKeyword(const Node: IKeywordNode): TDataValue;
begin
// Keywords are interned and immutable
Result := TDataValue.FromIntf<IKeywordNode>(Node);
end;
function TAstTransformer.VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
begin
var left := Accept(Node.Left).AsIntf<IAstNode>;
@@ -316,6 +326,30 @@ begin
Result := TDataValue.FromIntf<IMemberAccessNode>(TAst.MemberAccess(base, member));
end;
function TAstTransformer.VisitRecordLiteral(const Node: IRecordLiteralNode): TDataValue;
var
i: Integer;
hasChanged: Boolean;
newFields: TArray<TRecordFieldLiteral>;
newValue: IAstNode;
begin
hasChanged := False;
SetLength(newFields, Length(Node.Fields));
for i := 0 to High(Node.Fields) do
begin
newValue := Accept(Node.Fields[i].Value).AsIntf<IAstNode>;
if newValue <> Node.Fields[i].Value then
hasChanged := True;
newFields[i] := TRecordFieldLiteral.Create(Node.Fields[i].Name, newValue);
end;
if hasChanged then
Result := TDataValue.FromIntf<IRecordLiteralNode>(TAst.RecordLiteral(newFields))
else
Result := TDataValue.FromIntf<IRecordLiteralNode>(Node);
end;
function TAstTransformer.VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
begin
Result := TDataValue.FromIntf<ICreateSeriesNode>(Node);