using NubLang.Tokenization; namespace NubLang.Parsing.Syntax; public abstract record DefinitionSyntax(IEnumerable Tokens) : SyntaxNode(Tokens); public record FuncParameterSyntax(IEnumerable Tokens, string Name, TypeSyntax Type) : SyntaxNode(Tokens) { public override IEnumerable GetChildren() { yield return Type; } } public record FuncSignatureSyntax(IEnumerable Tokens, IReadOnlyList Parameters, TypeSyntax ReturnType) : SyntaxNode(Tokens) { public override IEnumerable GetChildren() { foreach (var parameter in Parameters) { yield return parameter; } yield return ReturnType; } } public record LocalFuncSyntax(IEnumerable Tokens, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : DefinitionSyntax(Tokens) { public override IEnumerable GetChildren() { yield return Signature; yield return Body; } } public record ExternFuncSyntax(IEnumerable Tokens, string Name, string CallName, FuncSignatureSyntax Signature) : DefinitionSyntax(Tokens) { public override IEnumerable GetChildren() { yield return Signature; } } public record StructFieldSyntax(IEnumerable Tokens, int Index, string Name, TypeSyntax Type, Optional Value) : SyntaxNode(Tokens) { public override IEnumerable GetChildren() { yield return Type; if (Value.HasValue) { yield return Value.Value; } } } public record StructFuncSyntax(IEnumerable Tokens, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : SyntaxNode(Tokens) { public override IEnumerable GetChildren() { yield return Signature; yield return Body; } } public record StructSyntax(IEnumerable Tokens, string Name, IReadOnlyList Fields, IReadOnlyList Functions, IReadOnlyList InterfaceImplementations) : DefinitionSyntax(Tokens) { public override IEnumerable GetChildren() { foreach (var field in Fields) { yield return field; } foreach (var func in Functions) { yield return func; } } } public record InterfaceFuncSyntax(IEnumerable Tokens, string Name, FuncSignatureSyntax Signature) : SyntaxNode(Tokens) { public override IEnumerable GetChildren() { yield return Signature; } } public record InterfaceSyntax(IEnumerable Tokens, string Name, IReadOnlyList Functions) : DefinitionSyntax(Tokens) { public override IEnumerable GetChildren() { foreach (var func in Functions) { yield return func; } } }