215 lines
5.2 KiB
C#
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; }
|
|
}
|