1use swc_common::Spanned;
2use swc_ecma_ast::*;
3use swc_ecma_codegen_macros::node_impl;
4
5#[node_impl]
6impl MacroNode for Param {
7 fn emit(&mut self, emitter: &mut Macro) -> Result {
8 emitter.emit_leading_comments_of_span(self.span(), false)?;
9
10 srcmap!(emitter, self, true);
11
12 emitter.emit_list(self.span, Some(&self.decorators), ListFormat::Decorators)?;
13
14 emit!(self.pat);
15
16 srcmap!(emitter, self, false);
17
18 Ok(())
19 }
20}
21
22#[node_impl]
23impl MacroNode for Pat {
24 fn emit(&mut self, emitter: &mut Macro) -> Result {
25 match self {
26 Pat::Array(ref n) => emit!(n),
27 Pat::Assign(ref n) => emit!(n),
28 Pat::Expr(ref n) => emit!(n),
29 Pat::Ident(ref n) => emit!(n),
30 Pat::Object(ref n) => emit!(n),
31 Pat::Rest(ref n) => emit!(n),
32 Pat::Invalid(n) => emit!(n),
33 }
34
35 if emitter.comments.is_some() {
36 emitter.emit_trailing_comments_of_pos(self.span().hi, true, true)?;
37 }
38
39 Ok(())
40 }
41}
42
43#[node_impl]
44impl MacroNode for RestPat {
45 fn emit(&mut self, emitter: &mut Macro) -> Result {
46 emitter.emit_leading_comments_of_span(self.span(), false)?;
47
48 punct!(emitter, self.dot3_token, "...");
49 emit!(self.arg);
50
51 if let Some(type_ann) = &self.type_ann {
52 punct!(emitter, ":");
53 formatting_space!(emitter);
54 emit!(type_ann);
55 }
56
57 Ok(())
58 }
59}
60
61#[node_impl]
62impl MacroNode for PropOrSpread {
63 fn emit(&mut self, emitter: &mut Macro) -> Result {
64 match self {
65 PropOrSpread::Prop(ref n) => emit!(n),
66 PropOrSpread::Spread(ref n) => emit!(n),
67 }
68
69 Ok(())
70 }
71}
72
73#[node_impl]
74impl MacroNode for SpreadElement {
75 fn emit(&mut self, emitter: &mut Macro) -> Result {
76 if emitter.comments.is_some() {
77 emitter.emit_leading_comments_of_span(self.span(), false)?;
78 }
79
80 srcmap!(emitter, self, true);
81
82 punct!(emitter, "...");
83 emit!(self.expr);
84
85 srcmap!(emitter, self, false);
86
87 Ok(())
88 }
89}
90
91#[node_impl]
92impl MacroNode for AssignTarget {
93 fn emit(&mut self, emitter: &mut Macro) -> Result {
94 match self {
95 AssignTarget::Simple(ref n) => emit!(n),
96 AssignTarget::Pat(ref n) => emit!(n),
97 }
98
99 Ok(())
100 }
101}
102
103#[node_impl]
104impl MacroNode for SimpleAssignTarget {
105 fn emit(&mut self, emitter: &mut Macro) -> Result {
106 match self {
107 SimpleAssignTarget::Ident(n) => emit!(n),
108 SimpleAssignTarget::Member(n) => emit!(n),
109 SimpleAssignTarget::Invalid(n) => emit!(n),
110 SimpleAssignTarget::SuperProp(n) => emit!(n),
111 SimpleAssignTarget::Paren(n) => emit!(n),
112 SimpleAssignTarget::OptChain(n) => emit!(n),
113 SimpleAssignTarget::TsAs(n) => emit!(n),
114 SimpleAssignTarget::TsNonNull(n) => emit!(n),
115 SimpleAssignTarget::TsSatisfies(n) => emit!(n),
116 SimpleAssignTarget::TsTypeAssertion(n) => emit!(n),
117 SimpleAssignTarget::TsInstantiation(n) => emit!(n),
118 }
119
120 Ok(())
121 }
122}
123
124#[node_impl]
125impl MacroNode for AssignTargetPat {
126 fn emit(&mut self, emitter: &mut Macro) -> Result {
127 match self {
128 AssignTargetPat::Array(n) => emit!(n),
129 AssignTargetPat::Object(n) => emit!(n),
130 AssignTargetPat::Invalid(n) => emit!(n),
131 }
132
133 Ok(())
134 }
135}
136
137#[node_impl]
138impl MacroNode for ArrayPat {
139 fn emit(&mut self, emitter: &mut Macro) -> Result {
140 emitter.emit_leading_comments_of_span(self.span(), false)?;
141
142 srcmap!(emitter, self, true);
143
144 punct!(emitter, "[");
145
146 let mut format = ListFormat::ArrayBindingPatternElements;
147
148 if let Some(None) = self.elems.last() {
149 format |= ListFormat::ForceTrailingComma;
150 }
151
152 emitter.emit_list(self.span(), Some(&self.elems), format)?;
153 punct!(emitter, "]");
154 if self.optional {
155 punct!(emitter, "?");
156 }
157
158 if let Some(type_ann) = &self.type_ann {
159 punct!(emitter, ":");
160 space!(emitter);
161 emit!(type_ann);
162 }
163
164 srcmap!(emitter, self, false);
165
166 Ok(())
167 }
168}
169
170#[node_impl]
171impl MacroNode for AssignPat {
172 fn emit(&mut self, emitter: &mut Macro) -> Result {
173 emitter.emit_leading_comments_of_span(self.span(), false)?;
174
175 srcmap!(emitter, self, true);
176
177 emit!(self.left);
178 formatting_space!(emitter);
179 punct!(emitter, "=");
180 formatting_space!(emitter);
181 emit!(self.right);
182
183 srcmap!(emitter, self, false);
184
185 Ok(())
186 }
187}
188
189#[node_impl]
190impl MacroNode for ObjectPat {
191 fn emit(&mut self, emitter: &mut Macro) -> Result {
192 emitter.emit_leading_comments_of_span(self.span(), false)?;
193
194 srcmap!(emitter, self, true);
195 punct!(emitter, "{");
196
197 emitter.emit_list(
198 self.span(),
199 Some(&self.props),
200 ListFormat::ObjectBindingPatternElements | ListFormat::CanSkipTrailingComma,
201 )?;
202
203 punct!(emitter, "}");
204
205 if self.optional {
206 punct!(emitter, "?");
207 }
208
209 if let Some(type_ann) = &self.type_ann {
210 punct!(emitter, ":");
211 space!(emitter);
212 emit!(type_ann);
213 }
214
215 srcmap!(emitter, self, false);
216
217 Ok(())
218 }
219}
220
221#[node_impl]
222impl MacroNode for ObjectPatProp {
223 fn emit(&mut self, emitter: &mut Macro) -> Result {
224 match self {
225 ObjectPatProp::KeyValue(ref node) => emit!(node),
226 ObjectPatProp::Assign(ref node) => emit!(node),
227 ObjectPatProp::Rest(ref node) => emit!(node),
228 }
229
230 Ok(())
231 }
232}
233
234#[node_impl]
235impl MacroNode for KeyValuePatProp {
236 fn emit(&mut self, emitter: &mut Macro) -> Result {
237 emitter.emit_leading_comments_of_span(self.span(), false)?;
238
239 srcmap!(emitter, self, true);
240
241 emit!(self.key);
242 punct!(emitter, ":");
243 formatting_space!(emitter);
244 emit!(self.value);
245
246 srcmap!(emitter, self, false);
247
248 Ok(())
249 }
250}
251
252#[node_impl]
253impl MacroNode for AssignPatProp {
254 fn emit(&mut self, emitter: &mut Macro) -> Result {
255 emitter.emit_leading_comments_of_span(self.span(), false)?;
256
257 srcmap!(emitter, self, true);
258
259 emit!(self.key);
260 if let Some(value) = &self.value {
261 formatting_space!(emitter);
262 punct!(emitter, "=");
263 formatting_space!(emitter);
264 emit!(value);
265 }
266
267 srcmap!(emitter, self, false);
268
269 Ok(())
270 }
271}
272
273#[node_impl]
274impl MacroNode for ForHead {
275 fn emit(&mut self, emitter: &mut Macro) -> Result {
276 match self {
277 ForHead::Pat(n) => emit!(n),
278 ForHead::VarDecl(n) => emit!(n),
279 ForHead::UsingDecl(n) => emit!(n),
280 }
281
282 Ok(())
283 }
284}