mago_syntax/utils/
definition.rs1use crate::ast::Sequence;
2use crate::ast::Statement;
3
4#[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}