Skip to main content

stylex_transform/transform/fold/
fold_var_declarators.rs

1use swc_core::{
2  common::comments::Comments,
3  ecma::{
4    ast::{Pat, VarDeclarator},
5    visit::FoldWith,
6  },
7};
8
9use crate::StyleXTransform;
10use stylex_enums::core::TransformationCycle;
11
12impl<C> StyleXTransform<C>
13where
14  C: Comments,
15{
16  pub(crate) fn fold_var_declarators_impl(
17    &mut self,
18    mut var_declarators: Vec<VarDeclarator>,
19  ) -> Vec<VarDeclarator> {
20    match self.state.cycle {
21      TransformationCycle::Skip => return var_declarators,
22      TransformationCycle::Cleaning => {
23        var_declarators.retain(|decl| {
24          if let Pat::Ident(bind_ident) = &decl.name {
25            let decl_id = &bind_ident.sym;
26
27            if let Some(&count) = self.state.var_decl_count_map.get(decl_id) {
28              // Remove the variable declaration if it is used only once after transformation.
29              let is_used = count > 1
30                || self
31                  .state
32                  .style_vars_to_keep
33                  .iter()
34                  .any(|style_var| &style_var.0 == decl_id);
35
36              if !is_used {
37                self.state.cycle = TransformationCycle::Recounting;
38
39                decl.clone().fold_children_with(self);
40
41                self.state.cycle = TransformationCycle::Cleaning;
42              }
43
44              return is_used;
45            }
46          }
47
48          true
49        });
50      },
51      _ => {},
52    };
53
54    var_declarators.fold_children_with(self)
55  }
56}