i_slint_compiler/passes/
remove_unused_properties.rs

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
4//! Remove the properties which are not used
5
6use crate::object_tree::{Component, Document};
7use std::collections::HashSet;
8
9pub fn remove_unused_properties(doc: &Document) {
10    fn recurse_remove_unused_properties(component: &Component) {
11        crate::object_tree::recurse_elem_including_sub_components_no_borrow(
12            component,
13            &(),
14            &mut |elem, _| {
15                let mut elem = elem.borrow_mut();
16                let mut to_remove = HashSet::new();
17                for (prop, decl) in &elem.property_declarations {
18                    if !decl.expose_in_public_api
19                        && !elem.named_references.is_referenced(prop)
20                        && !elem.property_analysis.borrow().get(prop).is_some_and(|v| v.is_used())
21                        && !elem.change_callbacks.contains_key(prop)
22                    {
23                        to_remove.insert(prop.to_owned());
24                    }
25                }
26                for x in &to_remove {
27                    elem.property_declarations.remove(x);
28                    elem.property_analysis.borrow_mut().remove(x);
29                    elem.bindings.remove(x);
30                }
31                // Remove changed callbacks over properties that are not materialized as they are not used
32                let mut change_callbacks = std::mem::take(&mut elem.change_callbacks);
33                change_callbacks.retain(|prop, _| {
34                    super::materialize_fake_properties::has_declared_property(&elem, prop)
35                });
36                elem.change_callbacks = change_callbacks;
37            },
38        );
39    }
40    doc.visit_all_used_components(|component| recurse_remove_unused_properties(component))
41}