1#[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#[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#[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}