libgir/
visitors.rs

1use crate::library::*;
2
3pub trait FunctionsMutVisitor {
4    // TODO: remove interrupt functionality if it is not used
5    // visiting stops if returned false
6    fn visit_function_mut(&mut self, func: &mut Function) -> bool;
7}
8
9impl Namespace {
10    pub fn visit_functions_mut<V: FunctionsMutVisitor>(&mut self, visitor: &mut V) -> bool {
11        for type_ in self.types.iter_mut().flatten() {
12            if !type_.visit_functions_mut(visitor) {
13                return false;
14            }
15        }
16        true
17    }
18}
19
20impl Type {
21    pub fn visit_functions_mut<V: FunctionsMutVisitor>(&mut self, visitor: &mut V) -> bool {
22        match self {
23            Type::Class(class) => {
24                for function in &mut class.functions {
25                    if !visitor.visit_function_mut(function) {
26                        return false;
27                    }
28                }
29            }
30            Type::Interface(interface) => {
31                for function in &mut interface.functions {
32                    if !visitor.visit_function_mut(function) {
33                        return false;
34                    }
35                }
36            }
37            Type::Record(record) => {
38                for function in &mut record.functions {
39                    if !visitor.visit_function_mut(function) {
40                        return false;
41                    }
42                }
43            }
44            _ => (),
45        }
46        true
47    }
48}