using NubLang.Syntax.Tokenization; namespace NubLang.Syntax.Binding.Node; public enum BoundUnaryOperator { Negate, Invert } public enum BoundBinaryOperator { Equal, NotEqual, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, Plus, Minus, Multiply, Divide } public abstract record BoundExpression(IReadOnlyList Tokens, NubType Type) : BoundNode(Tokens); public record BoundBinaryExpression(IReadOnlyList Tokens, NubType Type, BoundExpression Left, BoundBinaryOperator Operator, BoundExpression Right) : BoundExpression(Tokens, Type); public record BoundUnaryExpression(IReadOnlyList Tokens, NubType Type, BoundUnaryOperator Operator, BoundExpression Operand) : BoundExpression(Tokens, Type); public record BoundFuncCall(IReadOnlyList Tokens, NubType Type, BoundExpression Expression, IReadOnlyList Parameters) : BoundExpression(Tokens, Type); public record BoundVariableIdent(IReadOnlyList Tokens, NubType Type, string Name) : BoundExpression(Tokens, Type); public record BoundLocalFuncIdent(IReadOnlyList Tokens, NubType Type, string Namespace, string Name) : BoundExpression(Tokens, Type); public record BoundExternFuncIdent(IReadOnlyList Tokens, NubType Type, string Namespace, string Name) : BoundExpression(Tokens, Type); public record BoundArrayInitializer(IReadOnlyList Tokens, NubType Type, BoundExpression Capacity, NubType ElementType) : BoundExpression(Tokens, Type); public record BoundArrayIndexAccess(IReadOnlyList Tokens, NubType Type, BoundExpression Target, BoundExpression Index) : BoundExpression(Tokens, Type); public record BoundArrowFunc(IReadOnlyList Tokens, NubType Type, IReadOnlyList Parameters, NubType ReturnType, BoundBlock Body) : BoundExpression(Tokens, Type); public record BoundAddressOf(IReadOnlyList Tokens, NubType Type, BoundExpression Expression) : BoundExpression(Tokens, Type); public record BoundLiteral(IReadOnlyList Tokens, NubType Type, string Literal, LiteralKind Kind) : BoundExpression(Tokens, Type); public record BoundStructFieldAccess(IReadOnlyList Tokens, NubType Type, NubCustomType StructType, BoundExpression Target, string Field) : BoundExpression(Tokens, Type); public record BoundTraitImplFuncAccess(IReadOnlyList Tokens, NubType Type, BoundExpression Target, string FuncName) : BoundExpression(Tokens, Type); public record BoundTraitFuncAccess(IReadOnlyList Tokens, NubType Type, NubCustomType TraitType, BoundExpression Target, string FuncName) : BoundExpression(Tokens, Type); public record BoundStructInitializer(IReadOnlyList Tokens, NubCustomType StructType, Dictionary Initializers) : BoundExpression(Tokens, StructType); public record BoundDereference(IReadOnlyList Tokens, NubType Type, BoundExpression Expression) : BoundExpression(Tokens, Type);