using Canon.Core.Abstractions; using Canon.Core.Enums; using Canon.Core.LexicalParser; using Canon.Core.SemanticParser; namespace Canon.Core.SyntaxNodes; public class ParameterGeneratorEventArgs : EventArgs { public required ExpressionList Parameters { get; init; } } public class NoParameterGeneratorEventArgs : EventArgs; public class ProcedureCall : NonTerminatedSyntaxNode { public override NonTerminatorType Type => NonTerminatorType.ProcedureCall; /// /// 调用函数的名称 /// public IdentifierSemanticToken ProcedureId => Children[0].Convert().Token.Convert(); /// /// 调用函数的参数 /// public List Parameters { get; } = []; /// /// 调用函数时含有参数的事件 /// public event EventHandler? OnParameterGenerator; /// /// 调用函数是没有参数的事件 /// public event EventHandler? OnNoParameterGenerator; private PascalType? _pascalType; public PascalType ReturnType { get { if (_pascalType is null) { throw new InvalidOperationException(); } return _pascalType; } set { _pascalType = value; } } public override void PreVisit(SyntaxNodeVisitor visitor) { visitor.PreVisit(this); RaiseEvent(); } public override void PostVisit(SyntaxNodeVisitor visitor) { visitor.PostVisit(this); RaiseEvent(); } public static ProcedureCall Create(List children) { ProcedureCall result = new() { Children = children }; if (children.Count == 4) { result.Parameters.AddRange(children[2].Convert().Expressions); } return result; } private void RaiseEvent() { if (Children.Count == 4) { OnParameterGenerator?.Invoke(this, new ParameterGeneratorEventArgs { Parameters = Children[2].Convert() }); } else { OnNoParameterGenerator?.Invoke(this, new NoParameterGeneratorEventArgs()); } OnParameterGenerator = null; OnNoParameterGenerator = null; } }