use crate::ast::node::call_expression::CallExpression; use crate::ast::node::closure::Closure; use crate::ast::node::literal::Literal; use crate::ast::node::names::FullyQualifiedName; use crate::ast::node::object_access::ObjectAccess; use crate::ast::node::operators::{BinaryOperator, PrefixUnaryOperator, SuffixUnaryOperator}; #[derive(Debug)] pub enum Expression { Ternary(Box), Binary(Box), UnaryPrefix(Box), UnarySuffix(Box), Call(Box), ObjectAccess(Box), Literal(Box), FullyQualifiedName(Box), Closure(Box), } #[derive(Debug)] pub struct TernaryExpression { condition: Box, true_expression: Box, false_expression: Box, } impl TernaryExpression { pub fn new( condition: Box, true_expression: Box, false_expression: Box, ) -> Self { Self { condition, true_expression, false_expression, } } pub fn condition(&self) -> &Expression { &self.condition } pub fn condition_mut(&mut self) -> &mut Expression { &mut self.condition } pub fn true_expression(&self) -> &Expression { &self.true_expression } pub fn true_expression_mut(&mut self) -> &mut Expression { &mut self.true_expression } pub fn false_expression(&self) -> &Expression { &self.false_expression } pub fn false_expression_mut(&mut self) -> &mut Expression { &mut self.false_expression } } #[derive(Debug)] pub struct BinaryExpression { left: Box, operator: BinaryOperator, right: Box, } impl BinaryExpression { pub fn new(left: Box, operator: BinaryOperator, right: Box) -> Self { Self { left, operator, right, } } pub fn left(&self) -> &Expression { &self.left } pub fn left_mut(&mut self) -> &mut Expression { &mut self.left } pub fn operator(&self) -> &BinaryOperator { &self.operator } pub fn right(&self) -> &Expression { &self.right } pub fn right_mut(&mut self) -> &mut Expression { &mut self.right } } #[derive(Debug)] pub struct PrefixExpression { operator: PrefixUnaryOperator, expression: Box, } impl PrefixExpression { pub fn new(operator: PrefixUnaryOperator, expression: Box) -> Self { Self { operator, expression, } } pub fn operator(&self) -> &PrefixUnaryOperator { &self.operator } pub fn expression(&self) -> &Expression { &self.expression } pub fn expression_mut(&mut self) -> &mut Expression { &mut self.expression } } #[derive(Debug)] pub struct SuffixExpression { expression: Box, operator: SuffixUnaryOperator, } impl SuffixExpression { pub fn new(expression: Box, operator: SuffixUnaryOperator) -> Self { Self { expression, operator, } } pub fn expression(&self) -> &Expression { &self.expression } pub fn expression_mut(&mut self) -> &mut Expression { &mut self.expression } pub fn operator(&self) -> &SuffixUnaryOperator { &self.operator } }