using Common; using Syntax.Tokenization; namespace Syntax.Node; public record StatementNode(IEnumerable Tokens) : Node(Tokens); public record BoundStatementNode(IEnumerable Tokens) : BoundNode(Tokens); public record StatementExpressionNode(IEnumerable Tokens, ExpressionNode Expression) : StatementNode(Tokens); public record BoundStatementExpressionNode(IEnumerable Tokens, BoundExpressionNode Expression) : BoundStatementNode(Tokens); public record ReturnNode(IEnumerable Tokens, Optional Value) : StatementNode(Tokens); public record BoundReturnNode(IEnumerable Tokens, Optional Value) : BoundStatementNode(Tokens); public record AssignmentNode(IEnumerable Tokens, ExpressionNode Expression, ExpressionNode Value) : StatementNode(Tokens); public record BoundAssignmentNode(IEnumerable Tokens, BoundExpressionNode Expression, BoundExpressionNode Value) : BoundStatementNode(Tokens); public record IfNode(IEnumerable Tokens, ExpressionNode Condition, BlockNode Body, Optional> Else) : StatementNode(Tokens); public record BoundIfNode(IEnumerable Tokens, BoundExpressionNode Condition, BoundBlock Body, Optional> Else) : BoundStatementNode(Tokens); public record VariableDeclarationNode(IEnumerable Tokens, string Name, Optional ExplicitType, Optional Assignment) : StatementNode(Tokens); public record BoundVariableDeclarationNode(IEnumerable Tokens, string Name, Optional ExplicitType, Optional Assignment, NubType Type) : BoundStatementNode(Tokens); public record ContinueNode(IEnumerable Tokens) : StatementNode(Tokens); public record BoundContinueNode(IEnumerable Tokens) : BoundStatementNode(Tokens); public record BreakNode(IEnumerable Tokens) : StatementNode(Tokens); public record BoundBreakNode(IEnumerable Tokens) : BoundStatementNode(Tokens); public record WhileNode(IEnumerable Tokens, ExpressionNode Condition, BlockNode Body) : StatementNode(Tokens); public record BoundWhileNode(IEnumerable Tokens, BoundExpressionNode Condition, BoundBlock Body) : BoundStatementNode(Tokens);