darklua 0.18.0

Transform Lua scripts
Documentation
use crate::{
    nodes::{Arguments, Expression, TableEntry},
    process::Evaluator,
};

pub(crate) fn preserve_arguments_side_effects(
    evaluator: &Evaluator,
    arguments: &Arguments,
) -> Vec<Expression> {
    match arguments {
        Arguments::Tuple(tuple) => tuple
            .iter_values()
            .filter(|value| evaluator.has_side_effects(value))
            .cloned()
            .collect(),
        Arguments::Table(table) => {
            let mut expressions = Vec::new();

            for entry in table.iter_entries() {
                match entry {
                    TableEntry::Field(field) => {
                        let expression = field.get_value();
                        if evaluator.has_side_effects(expression) {
                            expressions.push(expression.clone());
                        }
                    }
                    TableEntry::Index(index) => {
                        let key = index.get_key();
                        let value = index.get_value();

                        if evaluator.has_side_effects(key) {
                            expressions.push(key.clone());
                        }
                        if evaluator.has_side_effects(value) {
                            expressions.push(value.clone());
                        }
                    }
                    TableEntry::Value(value) => {
                        if evaluator.has_side_effects(value) {
                            expressions.push(*value.clone());
                        }
                    }
                }
            }

            expressions
        }
        Arguments::String(_) => Vec::new(),
    }
}