i_slint_compiler/passes/
collect_subcomponents.rs1#![allow(clippy::mutable_key_type)] use by_address::ByAddress;
9
10use crate::langtype::ElementType;
11use crate::object_tree::*;
12use std::collections::HashSet;
13use std::rc::Rc;
14
15pub fn collect_subcomponents(doc: &Document) {
17 let mut result = Vec::new();
18 let mut hash = HashSet::new();
19 for component in doc.exported_roots().chain(doc.popup_menu_impl.iter().cloned()) {
20 collect_subcomponents_recursive(&component, &mut result, &mut hash);
21 }
22 doc.used_types.borrow_mut().sub_components = result;
23}
24
25fn collect_subcomponents_recursive(
26 component: &Rc<Component>,
27 result: &mut Vec<Rc<Component>>,
28 hash: &mut HashSet<ByAddress<Rc<Component>>>,
29) {
30 hash.insert(ByAddress(component.clone()));
31 recurse_elem(&component.root_element, &(), &mut |elem: &ElementRc, &()| {
32 let base_comp = match &elem.borrow().base_type {
33 ElementType::Component(base_comp) => {
34 if hash.contains(&ByAddress(base_comp.clone())) {
35 return;
36 }
37 base_comp.clone()
38 }
39 _ => return,
40 };
41 collect_subcomponents_recursive(&base_comp, result, hash);
42 if base_comp.parent_element().is_some() {
43 return;
45 }
46 result.push(base_comp);
47 });
48 for popup in component.popup_windows.borrow().iter() {
49 collect_subcomponents_recursive(&popup.component, result, hash);
50 }
51}