Skip to main content

mago_syntax/utils/
definition.rs

1use crate::ast::Sequence;
2use crate::ast::Statement;
3
4/// Determine if a statement contains only definitions.
5#[inline]
6#[must_use]
7pub fn statement_contains_only_definitions(statement: &Statement) -> bool {
8    let (definitions, statements) = get_statement_stats(statement);
9
10    definitions != 0 && statements == 0
11}
12
13#[inline]
14#[must_use]
15pub fn statement_sequence_contains_only_definitions(statement: &Sequence<Statement>) -> bool {
16    let mut definitions = 0;
17    let mut statements = 0;
18    for statement in statement {
19        let (def, stmt) = get_statement_stats(statement);
20
21        definitions += def;
22        statements += stmt;
23    }
24
25    definitions != 0 && statements == 0
26}
27
28#[inline]
29fn get_statement_stats(statement: &Statement) -> (usize, usize) {
30    let mut total_definitions = 0;
31    let mut total_statements = 0;
32
33    match &statement {
34        Statement::Namespace(namespace) => {
35            for statement in namespace.statements() {
36                let (definitions, statements) = get_statement_stats(statement);
37                total_definitions += definitions;
38                total_statements += statements;
39            }
40        }
41        Statement::Block(block) => {
42            for statement in &block.statements {
43                let (definitions, statements) = get_statement_stats(statement);
44                total_definitions += definitions;
45                total_statements += statements;
46            }
47        }
48        Statement::Class(_)
49        | Statement::Interface(_)
50        | Statement::Trait(_)
51        | Statement::Enum(_)
52        | Statement::Function(_)
53        | Statement::Constant(_) => {
54            total_definitions += 1;
55        }
56        _ => {
57            total_statements += 1;
58        }
59    }
60
61    (total_definitions, total_statements)
62}