using NubLang.Tokenization; namespace NubLang.Parsing.Syntax; public abstract record StatementSyntax(IEnumerable Tokens) : SyntaxNode(Tokens); public record StatementExpressionSyntax(IEnumerable Tokens, ExpressionSyntax Expression) : StatementSyntax(Tokens) { public override IEnumerable GetChildren() { yield return Expression; } } public record ReturnSyntax(IEnumerable Tokens, Optional Value) : StatementSyntax(Tokens) { public override IEnumerable GetChildren() { if (Value.HasValue) { yield return Value.Value; } } } public record AssignmentSyntax(IEnumerable Tokens, ExpressionSyntax Target, ExpressionSyntax Value) : StatementSyntax(Tokens) { public override IEnumerable GetChildren() { yield return Target; yield return Value; } } public record IfSyntax(IEnumerable Tokens, ExpressionSyntax Condition, BlockSyntax Body, Optional> Else) : StatementSyntax(Tokens) { public override IEnumerable GetChildren() { yield return Condition; yield return Body; if (Else.HasValue) { if (Else.Value.IsCase1(out var elseIf)) { yield return elseIf; } else if (Else.Value.IsCase2(out var @else)) { yield return @else; } } } } public record VariableDeclarationSyntax(IEnumerable Tokens, string Name, Optional ExplicitType, Optional Assignment) : StatementSyntax(Tokens) { public override IEnumerable GetChildren() { if (ExplicitType.HasValue) { yield return ExplicitType.Value; } if (Assignment.HasValue) { yield return Assignment.Value; } } } public record ContinueSyntax(IEnumerable Tokens) : StatementSyntax(Tokens) { public override IEnumerable GetChildren() => []; } public record BreakSyntax(IEnumerable Tokens) : StatementSyntax(Tokens) { public override IEnumerable GetChildren() => []; } public record WhileSyntax(IEnumerable Tokens, ExpressionSyntax Condition, BlockSyntax Body) : StatementSyntax(Tokens) { public override IEnumerable GetChildren() => []; }