1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
3
4use crate::diagnostics::BuildDiagnostics;
5use crate::langtype::ElementType;
6use crate::object_tree::*;
7use crate::typeregister::TypeRegister;
8use std::rc::Rc;
9
10pub fn lower_component_container(
11 component: &Rc<Component>,
12 type_register: &TypeRegister,
13 diag: &mut BuildDiagnostics,
14) {
15 let empty_type: ElementType = type_register.empty_type();
16
17 recurse_elem_including_sub_components_no_borrow(component, &None, &mut |elem: &Rc>, _| {
18 if matches!(&elem.borrow().builtin_type(), Some(b) if b.name == "ComponentContainer") {
19 diagnose_component_container(element:elem, diag);
20 process_component_container(element:elem, &empty_type);
21 }
22 Some(elem.clone())
23 })
24}
25
26fn diagnose_component_container(element: &ElementRc, diag: &mut BuildDiagnostics) {
27 if !element.borrow().children.is_empty() {
28 diag.push_error(message:"ComponentContainers may not have children".into(), &*element.borrow());
29 }
30}
31
32fn process_component_container(element: &ElementRc, empty_type: &ElementType) {
33 let mut elem: RefMut<'_, Element> = element.borrow_mut();
34
35 let embedded_element: Rc> = Element::make_rc(self:Element {
36 base_type: empty_type.clone(),
37 id: elem.id.clone(),
38 debug: elem.debug.clone(),
39 enclosing_component: elem.enclosing_component.clone(),
40 default_fill_parent: (true, true),
41 is_legacy_syntax: elem.is_legacy_syntax,
42 inline_depth: elem.inline_depth,
43 is_component_placeholder: true,
44 ..Default::default()
45 });
46
47 elem.children.push(embedded_element);
48}
49