Skip to main content

stylex_transform/transform/fold/
fold_member_expression.rs

1use swc_core::{
2  common::comments::Comments,
3  ecma::{
4    ast::{Expr, MemberExpr, MemberProp},
5    visit::FoldWith,
6  },
7};
8
9use stylex_enums::core::TransformationCycle;
10use stylex_enums::style_vars_to_keep::{NonNullProp, NonNullProps};
11use stylex_structures::style_vars_to_keep::StyleVarsToKeep;
12
13use crate::{
14  StyleXTransform,
15  shared::utils::common::{
16    increase_ident_count, increase_member_ident_count, reduce_member_ident_count,
17  },
18};
19
20impl<C> StyleXTransform<C>
21where
22  C: Comments,
23{
24  pub(crate) fn fold_member_expr_impl(&mut self, member_expression: MemberExpr) -> MemberExpr {
25    match self.state.cycle {
26      TransformationCycle::Skip => member_expression,
27      TransformationCycle::StateFilling => {
28        if let Some(obj_ident) = member_expression.obj.as_ident() {
29          increase_member_ident_count(&mut self.state, &obj_ident.sym);
30        }
31        member_expression.fold_children_with(self)
32      },
33      TransformationCycle::Recounting => {
34        if let Some(obj_ident) = member_expression.obj.as_ident() {
35          reduce_member_ident_count(&mut self.state, &obj_ident.sym);
36        }
37        member_expression.fold_children_with(self)
38      },
39      TransformationCycle::PreCleaning => {
40        if let Expr::Ident(ident) = member_expression.obj.as_ref()
41          && self.state.style_map.contains_key(ident.sym.as_ref())
42        {
43          if let MemberProp::Ident(prop_ident) = &member_expression.prop
44            && self
45              .state
46              .member_object_ident_count_map
47              .get(&ident.sym)
48              .is_some_and(|&c| c > 0)
49          {
50            increase_ident_count(&mut self.state, ident);
51            self.state.style_vars_to_keep.insert(StyleVarsToKeep(
52              ident.sym.clone(),
53              NonNullProp::Atom(prop_ident.sym.clone()),
54              NonNullProps::True,
55            ));
56          };
57
58          if let MemberProp::Computed(_) = &member_expression.prop {
59            increase_ident_count(&mut self.state, ident);
60            self.state.style_vars_to_keep.insert(StyleVarsToKeep(
61              ident.sym.clone(),
62              NonNullProp::True,
63              NonNullProps::True,
64            ));
65          }
66        }
67
68        member_expression.fold_children_with(self)
69      },
70      _ => member_expression.fold_children_with(self),
71    }
72  }
73}