use luau_lexer::prelude::Token;
use luau_parser_derive::{Print, Range};
use crate::types::{Bracketed, Pointer, Table, TypeValue};
reexport!(table, var, function);
pub type ExpressionWrap = Bracketed<Pointer<Expression>>;
#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Range, Print)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum PrefixExp {
Var(Var),
FunctionCall(FunctionCall),
ExpressionWrap(ExpressionWrap),
}
#[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord, Range, Print)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum Expression {
#[default]
ERROR,
Nil(Token),
Boolean(Token),
Number(Token),
String(Token),
Closure(Pointer<Closure>),
FunctionCall(FunctionCall),
ExpressionWrap(ExpressionWrap),
Var(Var),
Table(Table),
UnaryExpression {
operator: Token,
expression: Pointer<Expression>,
},
BinaryExpression {
left: Pointer<Expression>,
operator: Token,
right: Pointer<Expression>,
},
TypeCast {
expression: Pointer<Expression>,
operator: Token,
cast_to: Pointer<TypeValue>,
},
IfExpression(IfExpression),
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Range, Print)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct IfExpression {
pub if_keyword: Token,
pub condition: Pointer<Expression>,
pub then_keyword: Token,
pub if_expression: Pointer<Expression>,
pub else_if_expressions: Pointer<Vec<ElseIfExpression>>,
pub else_keyword: Token,
pub else_expression: Pointer<Expression>,
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Range, Print)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct ElseIfExpression {
pub else_if_keyword: Token,
pub condition: Pointer<Expression>,
pub then_keyword: Token,
pub expression: Pointer<Expression>,
}