using Nub.Lang.Frontend.Lexing; using Nub.Lang.Frontend.Parsing.Statements; using Nub.Lang.Frontend.Typing; namespace Nub.Lang.Frontend.Parsing.Definitions; public class FuncParameter(string name, NubType type, bool variadic) { public string Name { get; } = name; public NubType Type { get; } = type; public bool Variadic { get; } = variadic; public override string ToString() => $"{Name}: {Type}"; } public interface IFuncSignature { public string Name { get; } public string Namespace { get; } public List Parameters { get; } public Optional ReturnType { get; } public string ToString() => $"{Name}({string.Join(", ", Parameters.Select(p => p.ToString()))}){(ReturnType.HasValue ? ": " + ReturnType.Value : "")}"; } public class LocalFuncDefinitionNode(IReadOnlyList tokens, Optional documentation, string name, string @namespace, List parameters, BlockNode body, Optional returnType, bool exported) : DefinitionNode(tokens, documentation), IFuncSignature { public string Name { get; } = name; public string Namespace { get; } = @namespace; public List Parameters { get; } = parameters; public BlockNode Body { get; } = body; public Optional ReturnType { get; } = returnType; public bool Exported { get; } = exported; public override string ToString() => $"{Name}({string.Join(", ", Parameters.Select(p => p.ToString()))}){(ReturnType.HasValue ? ": " + ReturnType.Value : "")}"; } public class ExternFuncDefinitionNode(IReadOnlyList tokens, Optional documentation, string name, string @namespace, string callName, List parameters, Optional returnType) : DefinitionNode(tokens, documentation), IFuncSignature { public string Name { get; } = name; public string Namespace { get; } = @namespace; public string CallName { get; } = callName; public List Parameters { get; } = parameters; public Optional ReturnType { get; } = returnType; public override string ToString() => $"{Name}({string.Join(", ", Parameters.Select(p => p.ToString()))}){(ReturnType.HasValue ? ": " + ReturnType.Value : "")}"; }