darklua_core/nodes/statements/
last_statement.rs1use 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 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}