using CanonSharp.Benchmark.Canon.Core.Abstractions; using CanonSharp.Benchmark.Canon.Core.Enums; using CanonSharp.Benchmark.Canon.Core.LexicalParser; namespace CanonSharp.Benchmark.Canon.Core.SyntaxNodes; public class ConstDeclaration : NonTerminatedSyntaxNode { public override NonTerminatorType Type => NonTerminatorType.ConstDeclaration; /// /// 是否递归的声明下一个ConstDeclaration /// public bool IsRecursive { get; private init; } /// /// 获得声明的常量 /// public (IdentifierSemanticToken, ConstValue) ConstValue => GetConstValue(); public override void PreVisit(SyntaxNodeVisitor visitor) { visitor.PreVisit(this); } public override void PostVisit(SyntaxNodeVisitor visitor) { visitor.PostVisit(this); } public static ConstDeclaration Create(List children) { bool isRecursive; if (children.Count == 3) { isRecursive = false; } else if (children.Count == 5) { isRecursive = true; } else { throw new InvalidOperationException(); } return new ConstDeclaration { Children = children, IsRecursive = isRecursive }; } private static IdentifierSemanticToken ConvertToIdentifierSemanticToken(SyntaxNodeBase node) { return (IdentifierSemanticToken)node.Convert().Token; } private (IdentifierSemanticToken, ConstValue) GetConstValue() { if (IsRecursive) { return (ConvertToIdentifierSemanticToken(Children[2]), Children[4].Convert()); } else { return (ConvertToIdentifierSemanticToken(Children[0]), Children[2].Convert()); } } }