swc_ecma_compiler/es2022/
static_blocks.rs

1use rustc_hash::FxHashSet;
2use swc_atoms::Atom;
3use swc_common::{source_map::PLACEHOLDER_SP, util::take::Take};
4use swc_ecma_ast::*;
5use swc_ecma_utils::ExprFactory;
6
7use crate::CompilerImpl;
8
9impl CompilerImpl<'_> {
10    pub(crate) fn transform_static_block(
11        &mut self,
12        mut static_block: StaticBlock,
13        private_id: Atom,
14    ) -> PrivateProp {
15        let mut stmts = static_block.body.stmts.take();
16        let span = static_block.span;
17
18        // We special-case the single expression case to avoid the iife, since it's
19        // common.
20        let value = if stmts.len() == 1 && stmts[0].is_expr() {
21            stmts[0].take().expr().map(|expr_stmt| expr_stmt.expr)
22        } else {
23            static_block.body.stmts = stmts;
24
25            let expr = CallExpr {
26                callee: ArrowExpr {
27                    body: Box::new(BlockStmtOrExpr::BlockStmt(static_block.body)),
28                    ..Default::default()
29                }
30                .as_callee(),
31                ..Default::default()
32            }
33            .into();
34
35            Some(Box::new(expr))
36        };
37
38        PrivateProp {
39            span,
40            is_static: true,
41            key: PrivateName {
42                span: PLACEHOLDER_SP,
43                name: private_id,
44            },
45            value,
46            ..Default::default()
47        }
48    }
49}
50
51pub(crate) fn generate_uid(deny_list: &FxHashSet<Atom>, i: &mut u32) -> Atom {
52    *i += 1;
53
54    let mut uid: Atom = if *i == 1 {
55        "_".to_string()
56    } else {
57        format!("_{i}")
58    }
59    .into();
60    while deny_list.contains(&uid) {
61        *i += 1;
62        uid = format!("_{i}").into();
63    }
64
65    uid
66}