AST list refactoring
This commit is contained in:
@@ -332,6 +332,7 @@ var
|
||||
parentBuilder: IScopeBuilder;
|
||||
paramType: IStaticType;
|
||||
newParams: TArray<IIdentifierNode>;
|
||||
newParamsAsNodes: TArray<IAstNode>;
|
||||
newBody: IAstNode;
|
||||
finalLayout: IScopeLayout;
|
||||
i, slot: Integer;
|
||||
@@ -342,7 +343,8 @@ var
|
||||
startCount: Integer;
|
||||
hasNested: Boolean;
|
||||
paramIdentity: INamedIdentity;
|
||||
paramList: IParameterList;
|
||||
paramsTuple: ITupleNode;
|
||||
paramNode: IAstNode;
|
||||
begin
|
||||
L := Node.AsLambdaExpression;
|
||||
startCount := FLambdaCounter;
|
||||
@@ -357,13 +359,23 @@ begin
|
||||
try
|
||||
FCurrentBuilder.Define('<self>');
|
||||
|
||||
SetLength(newParams, L.Parameters.Count);
|
||||
paramsTuple := L.Parameters;
|
||||
SetLength(newParams, paramsTuple.Count);
|
||||
|
||||
for i := 0 to L.Parameters.Count - 1 do
|
||||
for i := 0 to paramsTuple.Count - 1 do
|
||||
begin
|
||||
var paramNode := L.Parameters[i];
|
||||
var paramName := paramNode.Name;
|
||||
paramIdentity := paramNode.Identity.AsNamed;
|
||||
paramNode := paramsTuple.Items[i];
|
||||
|
||||
if paramNode.Kind <> akIdentifier then
|
||||
begin
|
||||
if Assigned(FLog) then
|
||||
FLog.AddError('Parameter must be an identifier.', paramNode);
|
||||
continue;
|
||||
end;
|
||||
|
||||
var paramIdent := paramNode.AsIdentifier;
|
||||
var paramName := paramIdent.Name;
|
||||
paramIdentity := paramIdent.Identity.AsNamed;
|
||||
|
||||
if FCurrentBuilder.FindSlot(paramName) >= 0 then
|
||||
begin
|
||||
@@ -415,9 +427,23 @@ begin
|
||||
end;
|
||||
|
||||
hasNested := FLambdaCounter > (startCount + 1);
|
||||
paramList := TParameterList.Create(newParams, L.Parameters.Identity);
|
||||
|
||||
Result := TAst.LambdaExpr(Node.Identity, paramList, newBody, finalLayout, nil, upvaluesList, hasNested, L.IsPure);
|
||||
// Convert TArray<IIdentifierNode> -> TArray<IAstNode> for Tuple factory
|
||||
SetLength(newParamsAsNodes, Length(newParams));
|
||||
for i := 0 to High(newParams) do
|
||||
newParamsAsNodes[i] := newParams[i];
|
||||
|
||||
Result :=
|
||||
TAst.LambdaExpr(
|
||||
Node.Identity,
|
||||
TAst.Tuple(L.Parameters.Identity, newParamsAsNodes),
|
||||
newBody,
|
||||
finalLayout,
|
||||
nil,
|
||||
upvaluesList,
|
||||
hasNested,
|
||||
L.IsPure
|
||||
);
|
||||
end;
|
||||
|
||||
function TAstBinder.VisitFunctionCall(const Node: IAstNode): IAstNode;
|
||||
@@ -435,7 +461,7 @@ begin
|
||||
end
|
||||
else
|
||||
begin
|
||||
var memberAccess := TAst.MemberAccess(Node.Identity, Accept(C.Arguments[0]), C.Callee.AsKeyword);
|
||||
var memberAccess := TAst.MemberAccess(Node.Identity, Accept(C.Arguments.Items[0]), C.Callee.AsKeyword);
|
||||
Result := memberAccess;
|
||||
exit;
|
||||
end;
|
||||
|
||||
Reference in New Issue
Block a user