AyCode.Blazor/AyCode.Blazor.Components/Services/ExpressionHelpers/AcExpressionNode.cs

215 lines
5.2 KiB
C#

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