swc_ecma_codegen/
pat.rs

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}