using System.Linq.Expressions; using System.Text.Json.Serialization; namespace AyCode.Blazor.Components.Services.ExpressionHelpers; /// /// Universal DTO representing any Expression node. /// Recursively represents the entire Expression tree. /// Serializable to JSON for transport over SignalR or HTTP. /// public sealed class AcExpressionNode { /// /// The expression node type (Add, Equal, Call, MemberAccess, Lambda, etc.) /// public ExpressionType NodeType { get; set; } /// /// The CLR type name of this expression's result. /// public string? TypeName { get; set; } #region Binary Expressions (Add, Equal, AndAlso, OrElse, etc.) /// /// Left operand for binary expressions. /// public AcExpressionNode? Left { get; set; } /// /// Right operand for binary expressions. /// public AcExpressionNode? Right { get; set; } #endregion #region Unary Expressions (Not, Convert, Negate, etc.) /// /// Operand for unary expressions. /// public AcExpressionNode? Operand { get; set; } #endregion #region Lambda Expressions /// /// Body of lambda expression. /// public AcExpressionNode? Body { get; set; } /// /// Parameter definitions for lambda expressions. /// public List? Parameters { get; set; } #endregion #region Member Access /// /// Member/property/field name for MemberAccess expressions. /// public string? MemberName { get; set; } /// /// Object expression for member access or instance method calls. /// public AcExpressionNode? Object { get; set; } /// /// Declaring type for static members. /// public string? DeclaringType { get; set; } #endregion #region Method Call /// /// Method name for Call expressions. /// public string? MethodName { get; set; } /// /// Arguments for method calls. /// public List? Arguments { get; set; } /// /// Generic type arguments for generic method calls. /// public List? GenericArguments { get; set; } #endregion #region Constant /// /// Serialized constant value (JSON). /// public string? Value { get; set; } #endregion #region Parameter /// /// Parameter name for Parameter expressions. /// public string? ParameterName { get; set; } /// /// Parameter index (for matching parameters in lambda). /// public int? ParameterIndex { get; set; } #endregion #region Conditional (Ternary) /// /// Test expression for conditional expressions. /// public AcExpressionNode? Test { get; set; } /// /// IfTrue branch for conditional expressions. /// public AcExpressionNode? IfTrue { get; set; } /// /// IfFalse branch for conditional expressions. /// public AcExpressionNode? IfFalse { get; set; } #endregion #region New Expression /// /// Constructor arguments for New expressions. /// public List? ConstructorArguments { get; set; } /// /// Member bindings for MemberInit expressions. /// public List? MemberBindings { get; set; } #endregion #region Array/Collection /// /// Elements for NewArrayInit expressions. /// public List? Elements { get; set; } #endregion } /// /// Represents a parameter definition in a lambda expression. /// public sealed class ParameterNode { /// /// Parameter name. /// public string Name { get; set; } = ""; /// /// Parameter type name. /// public string TypeName { get; set; } = ""; /// /// Parameter index in the lambda. /// public int Index { get; set; } } /// /// Represents a member binding in MemberInit expressions. /// public sealed class MemberBindingNode { /// /// The member name being bound. /// public string MemberName { get; set; } = ""; /// /// The binding type (Assignment, MemberBinding, ListBinding). /// public MemberBindingType BindingType { get; set; } /// /// The expression being assigned (for Assignment bindings). /// public AcExpressionNode? Expression { get; set; } /// /// Nested bindings (for MemberMemberBinding). /// public List? Bindings { get; set; } /// /// Element initializers (for ListBinding). /// public List>? Initializers { get; set; } }