swc_ecma_compiler/es2022/
static_blocks.rs1use 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 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}