darklua_core/utils/
expressions_as_statement.rs

1use 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}