using Nub.Lang.Frontend.Lexing; namespace Nub.Lang.Frontend.Parsing; public interface IFuncSignature { public string Name { get; } public List Parameters { get; } public Optional ReturnType { get; } public bool SignatureMatches(string name, List parameters) { if (Name != name) return false; if (Parameters.Count == 0 && parameters.Count == 0) return true; if (Parameters.Count > parameters.Count) return false; for (var i = 0; i < parameters.Count; i++) { if (i > Parameters.Count) { if (Parameters[^1].Variadic) { if (!NubType.IsCompatibleWith(parameters[i], Parameters[^1].Type)) { return false; } } else { return false; } } else if (!NubType.IsCompatibleWith(parameters[i], Parameters[i].Type)) { return false; } } return true; } public string ToString() => $"{Name}({string.Join(", ", Parameters.Select(p => p.ToString()))}){(ReturnType.HasValue ? ": " + ReturnType.Value : "")}"; } public class LocalFuncDefinitionNode(IReadOnlyList tokens, Optional documentation, string name, List parameters, BlockNode body, Optional returnType, bool global) : DefinitionNode(tokens, documentation), IFuncSignature { public string Name { get; } = name; public List Parameters { get; } = parameters; public BlockNode Body { get; } = body; public Optional ReturnType { get; } = returnType; public bool Global { get; } = global; 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, List parameters, Optional returnType) : DefinitionNode(tokens, documentation), IFuncSignature { public string Name { get; } = name; 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 : "")}"; }