swc_ecma_compat_es2022/class_properties/
class_name_tdz.rs

1use swc_common::DUMMY_SP;
2use swc_ecma_ast::*;
3use swc_ecma_transforms_base::helper;
4use swc_ecma_utils::ExprFactory;
5use swc_ecma_visit::{noop_visit_mut_type, VisitMut, VisitMutWith};
6use swc_trace_macro::swc_trace;
7
8pub(super) struct ClassNameTdzFolder<'a> {
9    pub class_name: &'a Ident,
10}
11
12#[swc_trace]
13impl VisitMut for ClassNameTdzFolder<'_> {
14    noop_visit_mut_type!(fail);
15
16    fn visit_mut_expr(&mut self, expr: &mut Expr) {
17        match expr {
18            Expr::Ident(i) => {
19                //
20
21                if i.sym == self.class_name.sym {
22                    *expr = SeqExpr {
23                        span: DUMMY_SP,
24                        exprs: vec![
25                            Box::new(Expr::Call(CallExpr {
26                                span: DUMMY_SP,
27                                callee: helper!(class_name_tdz_error),
28                                args: vec![Str {
29                                    span: i.span,
30                                    raw: None,
31                                    value: i.sym.clone().into(),
32                                }
33                                .as_arg()],
34
35                                ..Default::default()
36                            })),
37                            Box::new(Expr::Ident(i.clone())),
38                        ],
39                    }
40                    .into();
41                }
42            }
43
44            _ => {
45                expr.visit_mut_children_with(self);
46            }
47        }
48    }
49}