Keywords
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user