Skip to content

Commit ce4526f

Browse files
committed
[core][rewriter] rewrite array destructuring as well
1 parent d3b399c commit ce4526f

File tree

1 file changed

+54
-3
lines changed

1 file changed

+54
-3
lines changed

rewriter/js/src/visitor.rs

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,10 @@ where
174174
match &p.binding {
175175
AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(d) => {
176176
// { location: x = parent } = {};
177-
177+
// if let Some(name) = p.binding.iden && name == "location" {
178+
// self.jschanges.add(rewrite!(p.span(), TempVar));
179+
// *location_assigned = true;
180+
// }
178181
// we still need to rewrite whatever stuff might be in the default expression
179182
walk::walk_expression(self, &d.init);
180183
}
@@ -187,13 +190,50 @@ where
187190
self.jschanges.add(rewrite!(p.span(), TempVar));
188191
*location_assigned = true;
189192
}
193+
}
194+
AssignmentTargetMaybeDefault::ArrayAssignmentTarget(a) => {
195+
self.recurse_array_assignment_target(a, restids, location_assigned);
190196
}
191197
_ => {}
192198
}
193199
}
194200
}
195201
}
196202
}
203+
fn recurse_array_assignment_target(
204+
&mut self,
205+
s: &oxc::ast::ast::ArrayAssignmentTarget<'data>,
206+
restids: &mut Vec<Atom<'data>>,
207+
location_assigned: &mut bool,
208+
) {
209+
// note that i don't actually have to care about the rest param here since it wont have dangerous props. i still need to keep track of the object destructure rests though
210+
for elem in &s.elements {
211+
if let Some(elem) = elem {
212+
match elem {
213+
AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(p) => {
214+
if let Some(name) = p.binding.get_identifier_name() && name == "location" {
215+
self.jschanges.add(rewrite!(p.span(), TempVar));
216+
*location_assigned = true;
217+
}
218+
walk::walk_expression(self, &p.init);
219+
}
220+
AssignmentTargetMaybeDefault::AssignmentTargetIdentifier(p) => {
221+
if p.name == "location" {
222+
self.jschanges.add(rewrite!(p.span(), TempVar));
223+
*location_assigned = true;
224+
}
225+
}
226+
AssignmentTargetMaybeDefault::ObjectAssignmentTarget(o) => {
227+
self.recurse_object_assignment_target(o, restids, location_assigned);
228+
}
229+
AssignmentTargetMaybeDefault::ArrayAssignmentTarget(a) => {
230+
self.recurse_array_assignment_target(a, restids, location_assigned);
231+
}
232+
_ => {}
233+
}
234+
}
235+
}
236+
}
197237

198238
fn scramitize(&mut self, span: Span) {
199239
self.jschanges.add(rewrite!(span, Scramitize));
@@ -438,13 +478,11 @@ where
438478
match &it.kind {
439479
BindingPatternKind::BindingIdentifier(p) => {
440480
// let a = 0;
441-
dbg!(&p);
442481
walk::walk_binding_identifier(self, p);
443482
}
444483
BindingPatternKind::AssignmentPattern(p) => {
445484
walk::walk_binding_pattern(self, &p.left);
446485
walk::walk_expression(self, &p.right);
447-
dbg!(&p);
448486
}
449487
BindingPatternKind::ObjectPattern(p) => {
450488
for prop in &p.properties {
@@ -533,6 +571,19 @@ where
533571
}
534572
return;
535573
}
574+
AssignmentTarget::ArrayAssignmentTarget(a) => {
575+
if !self.flags.destructure_rewrites {
576+
return;
577+
}
578+
579+
let mut restids: Vec<Atom<'data>> = Vec::new();
580+
let mut location_assigned: bool = false;
581+
self.recurse_array_assignment_target(a, &mut restids, &mut location_assigned);
582+
if restids.len() > 0 || location_assigned {
583+
self.jschanges
584+
.add(rewrite!(it.span, WrapObjectAssignment { restids, location_assigned }));
585+
}
586+
}
536587
_ => {}
537588
}
538589
walk::walk_expression(self, &it.right);

0 commit comments

Comments
 (0)