AST list refactoring
This commit is contained in:
+49
-69
@@ -59,10 +59,7 @@ type
|
||||
function VisitIdentifier(const Node: IAstNode): TJSONObject;
|
||||
function VisitKeyword(const Node: IAstNode): TJSONObject;
|
||||
|
||||
function VisitParameterList(const Node: IAstNode): TJSONObject;
|
||||
function VisitArgumentList(const Node: IAstNode): TJSONObject;
|
||||
function VisitExpressionList(const Node: IAstNode): TJSONObject;
|
||||
function VisitRecordFieldList(const Node: IAstNode): TJSONObject;
|
||||
function VisitTuple(const Node: IAstNode): TJSONObject;
|
||||
function VisitRecordField(const Node: IAstNode): TJSONObject;
|
||||
|
||||
function VisitIfExpression(const Node: IAstNode): TJSONObject;
|
||||
@@ -86,8 +83,6 @@ type
|
||||
function VisitSeriesLength(const Node: IAstNode): TJSONObject;
|
||||
function VisitNop(const Node: IAstNode): TJSONObject;
|
||||
|
||||
function VisitTuple(const Node: IAstNode): TJSONObject;
|
||||
|
||||
function VisitPipeInput(const Node: IAstNode): TJSONObject;
|
||||
function VisitPipeSelectorList(const Node: IAstNode): TJSONObject;
|
||||
function VisitPipeInputList(const Node: IAstNode): TJSONObject;
|
||||
@@ -120,10 +115,7 @@ begin
|
||||
Register(akIdentifier, VisitIdentifier);
|
||||
Register(akKeyword, VisitKeyword);
|
||||
|
||||
Register(akParameterList, VisitParameterList);
|
||||
Register(akArgumentList, VisitArgumentList);
|
||||
Register(akExpressionList, VisitExpressionList);
|
||||
Register(akRecordFieldList, VisitRecordFieldList);
|
||||
Register(akTuple, VisitTuple);
|
||||
Register(akRecordField, VisitRecordField);
|
||||
|
||||
Register(akIfExpression, VisitIfExpression);
|
||||
@@ -147,8 +139,6 @@ begin
|
||||
Register(akRecur, VisitRecurNode);
|
||||
Register(akNop, VisitNop);
|
||||
|
||||
Register(akTuple, VisitTuple);
|
||||
|
||||
Register(akPipeInput, VisitPipeInput);
|
||||
Register(akPipeSelectorList, VisitPipeSelectorList);
|
||||
Register(akPipeInputList, VisitPipeInputList);
|
||||
@@ -223,6 +213,24 @@ begin
|
||||
Result.AddPair('Name', TJSONString.Create(Node.AsKeyword.Value.Name));
|
||||
end;
|
||||
|
||||
function TJsonAstConverter.VisitTuple(const Node: IAstNode): TJSONObject;
|
||||
var
|
||||
T: ITupleNode;
|
||||
elemsArray: TJSONArray;
|
||||
i: Integer;
|
||||
begin
|
||||
T := Node.AsTuple;
|
||||
Result := TJSONObject.Create;
|
||||
Result.AddPair('NodeType', TJSONString.Create('Tuple'));
|
||||
|
||||
elemsArray := TJSONArray.Create;
|
||||
for i := 0 to T.Count - 1 do
|
||||
begin
|
||||
elemsArray.Add(Visit(T.Items[i]));
|
||||
end;
|
||||
Result.AddPair('Elements', elemsArray);
|
||||
end;
|
||||
|
||||
function TJsonAstConverter.VisitIfExpression(const Node: IAstNode): TJSONObject;
|
||||
var
|
||||
E: IIfExpressionNode;
|
||||
@@ -286,9 +294,10 @@ var
|
||||
begin
|
||||
L := Node.AsLambdaExpression;
|
||||
paramsArray := TJSONArray.Create;
|
||||
// Iterate Tuple
|
||||
for i := 0 to L.Parameters.Count - 1 do
|
||||
begin
|
||||
paramsArray.Add(Visit(L.Parameters[i]));
|
||||
paramsArray.Add(Visit(L.Parameters.Items[i]));
|
||||
end;
|
||||
|
||||
Result := TJSONObject.Create;
|
||||
@@ -305,9 +314,10 @@ var
|
||||
begin
|
||||
M := Node.AsMacroDefinition;
|
||||
paramsArray := TJSONArray.Create;
|
||||
// Iterate Tuple
|
||||
for i := 0 to M.Parameters.Count - 1 do
|
||||
begin
|
||||
paramsArray.Add(Visit(M.Parameters[i]));
|
||||
paramsArray.Add(Visit(M.Parameters.Items[i]));
|
||||
end;
|
||||
|
||||
Result := TJSONObject.Create;
|
||||
@@ -346,9 +356,10 @@ var
|
||||
begin
|
||||
C := Node.AsFunctionCall;
|
||||
argsArray := TJSONArray.Create;
|
||||
// Iterate Tuple
|
||||
for i := 0 to C.Arguments.Count - 1 do
|
||||
begin
|
||||
argsArray.Add(Visit(C.Arguments[i]));
|
||||
argsArray.Add(Visit(C.Arguments.Items[i]));
|
||||
end;
|
||||
|
||||
Result := TJSONObject.Create;
|
||||
@@ -365,9 +376,10 @@ var
|
||||
begin
|
||||
M := Node.AsMacroExpansion;
|
||||
argsArray := TJSONArray.Create;
|
||||
// Iterate Tuple
|
||||
for i := 0 to M.CallNode.Arguments.Count - 1 do
|
||||
begin
|
||||
argsArray.Add(Visit(M.CallNode.Arguments[i]));
|
||||
argsArray.Add(Visit(M.CallNode.Arguments.Items[i]));
|
||||
end;
|
||||
|
||||
Result := TJSONObject.Create;
|
||||
@@ -385,9 +397,10 @@ var
|
||||
begin
|
||||
R := Node.AsRecur;
|
||||
argsArray := TJSONArray.Create;
|
||||
// Iterate Tuple
|
||||
for i := 0 to R.Arguments.Count - 1 do
|
||||
begin
|
||||
argsArray.Add(Visit(R.Arguments[i]));
|
||||
argsArray.Add(Visit(R.Arguments.Items[i]));
|
||||
end;
|
||||
|
||||
Result := TJSONObject.Create;
|
||||
@@ -403,9 +416,10 @@ var
|
||||
begin
|
||||
B := Node.AsBlockExpression;
|
||||
exprsArray := TJSONArray.Create;
|
||||
// Iterate Tuple
|
||||
for i := 0 to B.Expressions.Count - 1 do
|
||||
begin
|
||||
exprsArray.Add(Visit(B.Expressions[i]));
|
||||
exprsArray.Add(Visit(B.Expressions.Items[i]));
|
||||
end;
|
||||
|
||||
Result := TJSONObject.Create;
|
||||
@@ -477,9 +491,10 @@ begin
|
||||
Result := TJSONObject.Create;
|
||||
Result.AddPair('NodeType', TJSONString.Create('RecordLiteral'));
|
||||
fieldsArray := TJSONArray.Create;
|
||||
// Iterate Tuple
|
||||
for i := 0 to R.Fields.Count - 1 do
|
||||
begin
|
||||
fieldsArray.Add(Visit(R.Fields[i]));
|
||||
fieldsArray.Add(Visit(R.Fields.Items[i]));
|
||||
end;
|
||||
Result.AddPair('Fields', fieldsArray);
|
||||
end;
|
||||
@@ -536,56 +551,6 @@ begin
|
||||
Result.AddPair('NodeType', TJSONString.Create('Nop'));
|
||||
end;
|
||||
|
||||
function TJsonAstConverter.VisitTuple(const Node: IAstNode): TJSONObject;
|
||||
var
|
||||
T: ITupleNode;
|
||||
elemsArray: TJSONArray;
|
||||
i: Integer;
|
||||
begin
|
||||
T := Node.AsTuple;
|
||||
Result := TJSONObject.Create;
|
||||
Result.AddPair('NodeType', TJSONString.Create('Tuple'));
|
||||
|
||||
elemsArray := TJSONArray.Create;
|
||||
for i := 0 to High(T.Elements) do
|
||||
begin
|
||||
elemsArray.Add(Visit(T.Elements[i]));
|
||||
end;
|
||||
Result.AddPair('Elements', elemsArray);
|
||||
end;
|
||||
|
||||
function TJsonAstConverter.VisitParameterList(const Node: IAstNode): TJSONObject;
|
||||
begin
|
||||
Result := nil;
|
||||
end;
|
||||
function TJsonAstConverter.VisitArgumentList(const Node: IAstNode): TJSONObject;
|
||||
begin
|
||||
Result := nil;
|
||||
end;
|
||||
function TJsonAstConverter.VisitExpressionList(const Node: IAstNode): TJSONObject;
|
||||
begin
|
||||
Result := nil;
|
||||
end;
|
||||
function TJsonAstConverter.VisitRecordFieldList(const Node: IAstNode): TJSONObject;
|
||||
begin
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
function TJsonAstConverter.JsonToTupleNode(const AObj: TJSONObject): ITupleNode;
|
||||
var
|
||||
elems: TArray<IAstNode>;
|
||||
elemsArray: TJSONArray;
|
||||
i: Integer;
|
||||
begin
|
||||
elemsArray := AObj.GetValue<TJSONArray>('Elements');
|
||||
SetLength(elems, elemsArray.Count);
|
||||
for i := 0 to elemsArray.Count - 1 do
|
||||
begin
|
||||
elems[i] := JsonToNode(elemsArray.Items[i]);
|
||||
end;
|
||||
Result := TAst.Tuple(elems); // Factory handles identity/type defaults
|
||||
end;
|
||||
|
||||
function TJsonAstConverter.VisitPipeInput(const Node: IAstNode): TJSONObject;
|
||||
begin
|
||||
raise ENotSupportedException.Create('JSON Pipe Serialization not implemented.');
|
||||
@@ -968,4 +933,19 @@ begin
|
||||
Result := TAst.Nop.AsNop;
|
||||
end;
|
||||
|
||||
function TJsonAstConverter.JsonToTupleNode(const AObj: TJSONObject): ITupleNode;
|
||||
var
|
||||
elems: TArray<IAstNode>;
|
||||
elemsArray: TJSONArray;
|
||||
i: Integer;
|
||||
begin
|
||||
elemsArray := AObj.GetValue<TJSONArray>('Elements');
|
||||
SetLength(elems, elemsArray.Count);
|
||||
for i := 0 to elemsArray.Count - 1 do
|
||||
begin
|
||||
elems[i] := JsonToNode(elemsArray.Items[i]);
|
||||
end;
|
||||
Result := TAst.Tuple(elems); // Factory handles identity/type defaults
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user