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; }
}