Refactoring node to be immutable

This commit is contained in:
Michael Schimmel
2025-11-05 15:15:12 +01:00
parent 218bd9f506
commit 25984fe61a
7 changed files with 537 additions and 371 deletions
+12 -12
View File
@@ -128,7 +128,7 @@ begin
newArgs[i] := Accept(Node.Arguments[i]);
// 2. Create new node with inferred type
Result := TRecurNode.Create(newArgs, TTypes.Void);
Result := TAst.Recur(newArgs, TTypes.Void);
end;
function TTypeChecker.VisitVariableDeclaration(const Node: IVariableDeclarationNode): IAstNode;
@@ -201,7 +201,7 @@ begin
end;
// 5. Create the new Assignment node
Result := TAssignmentNode.Create(newIdent.AsIdentifier, newValue, targetType);
Result := TAst.Assign(newIdent.AsIdentifier, newValue, targetType);
end;
function TTypeChecker.VisitLambdaExpression(const Node: ILambdaExpressionNode): IAstNode;
@@ -325,7 +325,7 @@ begin
blockType := TTypes.Void;
// 3. Create new node
Result := TBlockExpressionNode.Create(newExprs, blockType);
Result := TAst.Block(newExprs, blockType);
end;
function TTypeChecker.VisitIfExpression(const Node: IIfExpressionNode): IAstNode;
@@ -352,7 +352,7 @@ begin
resultType := TTypeRules.Promote(thenType, elseType);
// 4. Create new node
Result := TIfExpressionNode.Create(newCond, newThen, newElse, resultType);
Result := TAst.IfExpr(newCond, newThen, newElse, resultType);
end;
function TTypeChecker.VisitTernaryExpression(const Node: ITernaryExpressionNode): IAstNode;
@@ -377,7 +377,7 @@ begin
resultType := TTypeRules.Promote(thenType, elseType);
// 4. Create new node
Result := TTernaryExpressionNode.Create(newCond, newThen, newElse, resultType);
Result := TAst.TernaryExpr(newCond, newThen, newElse, resultType);
end;
function TTypeChecker.VisitBinaryExpression(const Node: IBinaryExpressionNode): IAstNode;
@@ -397,7 +397,7 @@ begin
resultType := TTypeRules.ResolveBinaryOp(Node.Operator, leftType, rightType);
// 4. Create new node
Result := TBinaryExpressionNode.Create(newLeft, Node.Operator, newRight, resultType);
Result := TAst.BinaryExpr(newLeft, Node.Operator, newRight, resultType);
end;
function TTypeChecker.VisitUnaryExpression(const Node: IUnaryExpressionNode): IAstNode;
@@ -415,7 +415,7 @@ begin
resultType := TTypeRules.ResolveUnaryOp(Node.Operator, rightType);
// 4. Create new node
Result := TUnaryExpressionNode.Create(Node.Operator, newRight, resultType);
Result := TAst.UnaryExpr(Node.Operator, newRight, resultType);
end;
function TTypeChecker.VisitMemberAccess(const Node: IMemberAccessNode): IAstNode;
@@ -463,7 +463,7 @@ begin
end;
// 4. Create new node
Result := TMemberAccessNode.Create(newBase, newMember.AsKeyword, elemType);
Result := TAst.MemberAccess(newBase, newMember.AsKeyword, elemType);
end;
function TTypeChecker.VisitIndexer(const Node: IIndexerNode): IAstNode;
@@ -496,7 +496,7 @@ begin
end;
// 4. Create new node
Result := TIndexerNode.Create(newBase, newIndex, elemType);
Result := TAst.Indexer(newBase, newIndex, elemType);
end;
function TTypeChecker.VisitRecordLiteral(const Node: IRecordLiteralNode): IAstNode;
@@ -582,7 +582,7 @@ begin
end;
// Create new node
Result := TCreateSeriesNode.Create(Node.Definition, TTypes.CreateSeries(elemType));
Result := TAst.CreateSeries(Node.Definition, TTypes.CreateSeries(elemType));
end;
function TTypeChecker.VisitAddSeriesItem(const Node: IAddSeriesItemNode): IAstNode;
@@ -618,7 +618,7 @@ begin
end;
// 4. Create new node
Result := TAddSeriesItemNode.Create(newSeries.AsIdentifier, newValue, newLookback, TTypes.Void);
Result := TAst.AddSeriesItem(newSeries.AsIdentifier, newValue, newLookback, TTypes.Void);
end;
function TTypeChecker.VisitSeriesLength(const Node: ISeriesLengthNode): IAstNode;
@@ -639,7 +639,7 @@ begin
raise ETypeException.CreateFmt('"length" requires a series, but got %s', [seriesType.ToString]);
// 4. Create new node
Result := TSeriesLengthNode.Create(newSeries.AsIdentifier, TTypes.Ordinal);
Result := TAst.SeriesLength(newSeries.AsIdentifier, TTypes.Ordinal);
end;
end.