AST list refactoring

This commit is contained in:
Michael Schimmel
2026-01-04 22:41:44 +01:00
parent 2a7e6626ad
commit 242ec9a56e
27 changed files with 815 additions and 1076 deletions
+35 -9
View File
@@ -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;