darklua_core/nodes/statements/
last_statement.rs

1use crate::nodes::{Expression, Token};
2
3#[derive(Clone, Debug, PartialEq, Eq)]
4pub struct ReturnTokens {
5    pub r#return: Token,
6    pub commas: Vec<Token>,
7}
8
9impl ReturnTokens {
10    super::impl_token_fns!(
11        target = [r#return]
12        iter = [commas]
13    );
14}
15
16#[derive(Clone, Debug, Default, PartialEq, Eq)]
17pub struct ReturnStatement {
18    expressions: Vec<Expression>,
19    tokens: Option<ReturnTokens>,
20}
21
22impl ReturnStatement {
23    pub fn new(expressions: Vec<Expression>) -> Self {
24        Self {
25            expressions,
26            tokens: None,
27        }
28    }
29
30    /// Creates a new ReturnStatement with one expression.
31    /// ```rust
32    /// # use darklua_core::nodes::{Expression, ReturnStatement};
33    ///
34    /// let statement = ReturnStatement::one(Expression::from(true));
35    ///
36    /// // unknown case
37    /// assert_eq!(statement.len(), 1);
38    /// ```
39    pub fn one<E: Into<Expression>>(expression: E) -> Self {
40        Self {
41            expressions: vec![expression.into()],
42            tokens: None,
43        }
44    }
45
46    pub fn with_expression<E: Into<Expression>>(mut self, expression: E) -> Self {
47        self.expressions.push(expression.into());
48        self
49    }
50
51    #[inline]
52    pub fn iter_expressions(&self) -> impl Iterator<Item = &Expression> {
53        self.expressions.iter()
54    }
55
56    #[inline]
57    pub fn into_iter_expressions(self) -> impl Iterator<Item = Expression> {
58        self.expressions.into_iter()
59    }
60
61    #[inline]
62    pub fn iter_mut_expressions(&mut self) -> impl Iterator<Item = &mut Expression> {
63        self.expressions.iter_mut()
64    }
65
66    #[inline]
67    pub fn is_empty(&self) -> bool {
68        self.expressions.is_empty()
69    }
70
71    #[inline]
72    pub fn len(&self) -> usize {
73        self.expressions.len()
74    }
75
76    pub fn with_tokens(mut self, tokens: ReturnTokens) -> Self {
77        self.tokens = Some(tokens);
78        self
79    }
80
81    #[inline]
82    pub fn set_tokens(&mut self, tokens: ReturnTokens) {
83        self.tokens = Some(tokens);
84    }
85
86    #[inline]
87    pub fn get_tokens(&self) -> Option<&ReturnTokens> {
88        self.tokens.as_ref()
89    }
90
91    #[inline]
92    pub fn mutate_tokens(&mut self) -> Option<&mut ReturnTokens> {
93        self.tokens.as_mut()
94    }
95
96    super::impl_token_fns!(iter = [tokens]);
97}
98
99#[derive(Clone, Debug, PartialEq, Eq)]
100pub enum LastStatement {
101    Break(Option<Token>),
102    Continue(Option<Token>),
103    Return(ReturnStatement),
104}
105
106impl LastStatement {
107    #[inline]
108    pub fn new_break() -> Self {
109        Self::Break(None)
110    }
111
112    #[inline]
113    pub fn new_continue() -> Self {
114        Self::Continue(None)
115    }
116}
117
118impl From<ReturnStatement> for LastStatement {
119    fn from(statement: ReturnStatement) -> Self {
120        Self::Return(statement)
121    }
122}
123
124#[cfg(test)]
125mod test {
126    use super::*;
127
128    #[test]
129    fn default_return_statement_is_empty() {
130        assert!(ReturnStatement::default().is_empty())
131    }
132}