swc_ecma_utils/
macros.rs

1/// Shortcut for `quote_ident!(span.apply_mark(Mark::fresh(Mark::root())), s)`
2#[macro_export]
3macro_rules! private_ident {
4    ($s:expr) => {
5        private_ident!($crate::swc_common::DUMMY_SP, $s)
6    };
7    ($span:expr, $s:expr) => {{
8        let mark = $crate::swc_common::Mark::new();
9        let ctxt = $crate::swc_common::SyntaxContext::empty().apply_mark(mark);
10        $crate::swc_ecma_ast::Ident::new($s.into(), $span, ctxt)
11    }};
12}
13
14/// As we have multiple identifier types, the expected usage is
15/// `quote_ident!("foo").into()`.
16#[macro_export]
17macro_rules! quote_ident {
18    ($s:expr) => {{
19        let sym: $crate::swc_atoms::Atom = $s.into();
20        let id: $crate::swc_ecma_ast::IdentName = sym.into();
21
22        id
23    }};
24    ($ctxt:expr, $s:expr) => {{
25        let sym: $crate::swc_atoms::Atom = $s.into();
26        let id: $crate::swc_ecma_ast::Ident =
27            $crate::swc_ecma_ast::Ident::new(sym, $crate::swc_common::DUMMY_SP, $ctxt);
28
29        id
30    }};
31
32    ($ctxt:expr, $span:expr, $s:expr) => {{
33        $crate::swc_ecma_ast::Ident::new($s.into(), $span, $ctxt)
34    }};
35}
36
37#[macro_export]
38macro_rules! quote_str {
39    ($s:expr) => {
40        quote_str!($crate::swc_common::DUMMY_SP, $s)
41    };
42    ($span:expr, $s:expr) => {{
43        $crate::swc_ecma_ast::Str {
44            span: $span,
45            raw: None,
46            value: $s.into(),
47        }
48    }};
49}
50
51#[macro_export]
52macro_rules! quote_expr {
53    ($span:expr, null) => {{
54        use $crate::swc_ecma_ast::*;
55        Expr::Lit(Lit::Null(Null { span: $span }))
56    }};
57
58    ($span:expr, undefined) => {{
59        box Expr::Ident(Ident::new("undefined", $span))
60    }};
61}
62
63/// Creates a member expression.
64///
65/// # Usage
66/// ```rust,ignore
67/// member_expr!(span, Function.bind.apply);
68/// ```
69///
70/// Returns Box<[Expr](swc_ecma_ast::Expr)>.
71#[macro_export]
72macro_rules! member_expr {
73    ($ctxt:expr, $span:expr, $first:ident) => {{
74        use $crate::swc_ecma_ast::Expr;
75        Box::new(Expr::Ident($crate::quote_ident!($ctxt, $span, stringify!($first))))
76    }};
77
78    ($ctxt:expr, $span:expr, $first:ident . $($rest:tt)+) => {{
79        let obj = member_expr!($ctxt, $span, $first);
80
81        member_expr!(@EXT, $span, obj, $($rest)* )
82    }};
83
84    (@EXT, $span:expr, $obj:expr, $first:ident . $($rest:tt)* ) => {{
85        use $crate::swc_ecma_ast::MemberProp;
86        use $crate::swc_ecma_ast::IdentName;
87        let prop = MemberProp::Ident(IdentName::new(stringify!($first).into(), $span));
88
89        member_expr!(@EXT, $span, Box::new(Expr::Member(MemberExpr{
90            span: $crate::swc_common::DUMMY_SP,
91            obj: $obj,
92            prop,
93        })), $($rest)*)
94    }};
95
96    (@EXT, $span:expr, $obj:expr,  $first:ident) => {{
97        use $crate::swc_ecma_ast::*;
98        let prop = MemberProp::Ident(IdentName::new(stringify!($first).into(), $span));
99
100        MemberExpr{
101            span: $crate::swc_common::DUMMY_SP,
102            obj: $obj,
103            prop,
104        }
105    }};
106}
107
108#[cfg(test)]
109mod tests {
110    use swc_common::DUMMY_SP as span;
111    use swc_ecma_ast::*;
112
113    use crate::drop_span;
114
115    #[test]
116    fn quote_member_expr() {
117        let expr: Box<Expr> = drop_span(member_expr!(
118            Default::default(),
119            Default::default(),
120            Function.prototype.bind
121        ))
122        .into();
123
124        assert_eq!(
125            expr,
126            Box::new(Expr::Member(MemberExpr {
127                span,
128                obj: Box::new(Expr::Member(MemberExpr {
129                    span,
130                    obj: member_expr!(Default::default(), Default::default(), Function),
131                    prop: MemberProp::Ident("prototype".into()),
132                })),
133                prop: MemberProp::Ident("bind".into()),
134            }))
135        );
136    }
137}