Editor/Wiring/Expressions/Expression.cs

Abstract record Expression used by the editor wiring system. It is a polymorphic base type for various expression variants and configures System.Text.Json polymorphic serialization with a $type discriminator. It contains an Id GUID and a TypeId string.

using System;
using System.Text.Json.Serialization;

namespace Grains.RazorDesigner.Wiring;

[JsonPolymorphic( TypeDiscriminatorPropertyName = "$type" )]
[JsonDerivedType( typeof( LiteralExpression ),       "Literal" )]
[JsonDerivedType( typeof( SymbolRefExpression ),     "SymbolRef" )]
[JsonDerivedType( typeof( BinaryOpExpression ),      "BinaryOp" )]
[JsonDerivedType( typeof( UnaryOpExpression ),       "UnaryOp" )]
[JsonDerivedType( typeof( ConditionalExpression ),   "Conditional" )]
[JsonDerivedType( typeof( MethodCallExpression ),    "MethodCall" )]
[JsonDerivedType( typeof( MemberAccessExpression ),  "MemberAccess" )]
[JsonDerivedType( typeof( InlineExpression ),        "Inline" )]
public abstract record Expression
{
    public Guid Id { get; init; } = Guid.NewGuid();

    public string TypeId { get; init; }
}