darklua_core/utils/
expressions_as_statement.rs1use crate::nodes::{
2 BinaryExpression, BinaryOperator, Block, DoStatement, Expression, LocalAssignStatement,
3 Statement,
4};
5
6fn get_inner_expression(mut expression: Expression) -> Expression {
7 loop {
8 expression = match expression {
9 Expression::Parenthese(parenthese) => parenthese.into_inner_expression(),
10 Expression::TypeCast(type_cast) => type_cast.into_inner_expression(),
11 value => break value,
12 };
13 }
14}
15
16pub(crate) fn expressions_as_statement(expressions: Vec<Expression>) -> Statement {
17 let mut statements: Vec<Statement> = Vec::new();
18
19 for value in expressions {
20 match get_inner_expression(value) {
21 Expression::Call(call) => {
22 statements.push((*call).into());
23 }
24 value => {
25 if let Some(assign) = statements.last_mut().and_then(|statement| match statement {
26 Statement::LocalAssign(assign) => Some(assign),
27 _ => None,
28 }) {
29 assign.push_value(value);
30 } else {
31 statements.push(
32 LocalAssignStatement::from_variable("_")
33 .with_value(value)
34 .into(),
35 );
36 }
37 }
38 }
39 }
40
41 if statements.len() == 1 {
42 match statements.pop().unwrap() {
43 Statement::Call(call) => call.into(),
44 statement => statement,
45 }
46 } else {
47 DoStatement::new(Block::new(statements, None)).into()
48 }
49}
50
51pub(crate) fn expressions_as_expression(expressions: Vec<Expression>) -> Expression {
52 if expressions.is_empty() {
53 return Expression::nil();
54 }
55
56 if expressions.len() == 1 {
57 BinaryExpression::new(
58 BinaryOperator::And,
59 expressions.into_iter().next().unwrap(),
60 Expression::nil(),
61 )
62 .into()
63 } else {
64 expressions
65 .into_iter()
66 .rfold(Expression::nil(), |current, value| {
67 BinaryExpression::new(
68 BinaryOperator::And,
69 BinaryExpression::new(BinaryOperator::Or, value, true),
70 current,
71 )
72 .into()
73 })
74 }
75}