fix(es/compat): Visit assign expr in generator (#7932)

**Related issue:**
 - Closes #7809
This commit is contained in:
Austaras 2023-09-10 14:27:30 +08:00 committed by GitHub
parent d15eaf05cd
commit 97068e12d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 102 additions and 60 deletions

View File

@ -572,72 +572,70 @@ impl VisitMut for Generator {
e.visit_mut_children_with(self);
}
Expr::Assign(node) => {
if contains_yield(&node.right) {
match node.left.as_expr_mut() {
Some(Expr::Member(left)) => {
match &mut left.prop {
MemberProp::Ident(..) | MemberProp::PrivateName(..) => {
// a.b = yield;
//
// [intermediate]
// .local _a
// _a = a;
// .yield resumeLabel
// .mark resumeLabel
// _a.b = %sent%;
Expr::Assign(node) if contains_yield(&node.right) => {
match node.left.as_expr_mut() {
Some(Expr::Member(left)) => {
match &mut left.prop {
MemberProp::Ident(..) | MemberProp::PrivateName(..) => {
// a.b = yield;
//
// [intermediate]
// .local _a
// _a = a;
// .yield resumeLabel
// .mark resumeLabel
// _a.b = %sent%;
left.obj.visit_mut_with(self);
let obj = self.cache_expression(left.obj.take());
left.obj.visit_mut_with(self);
let obj = self.cache_expression(left.obj.take());
left.obj = Box::new(Expr::Ident(obj));
}
MemberProp::Computed(prop) => {
// [source]
// a[b] = yield;
//
// [intermediate]
// .local _a, _b
// _a = a;
// _b = b;
// .yield resumeLabel
// .mark resumeLabel
// _a[_b] = %sent%;
let prop_span = prop.span;
left.obj.visit_mut_with(self);
let obj = self.cache_expression(left.obj.take());
prop.visit_mut_with(self);
let prop = self.cache_expression(prop.expr.take());
left.obj = Box::new(Expr::Ident(obj));
left.prop = MemberProp::Computed(ComputedPropName {
span: prop_span,
expr: Box::new(Expr::Ident(prop)),
});
}
left.obj = Box::new(Expr::Ident(obj));
}
// [source]
}
_ => {
node.left.visit_mut_with(self);
}
}
if node.op != op!("=") {
let left_of_right = self.cache_expression(node.left.take().expect_expr());
MemberProp::Computed(prop) => {
// [source]
// a[b] = yield;
//
// [intermediate]
// .local _a, _b
// _a = a;
// _b = b;
// .yield resumeLabel
// .mark resumeLabel
// _a[_b] = %sent%;
let prop_span = prop.span;
node.right.visit_mut_with(self);
left.obj.visit_mut_with(self);
let obj = self.cache_expression(left.obj.take());
*e = Expr::Assign(AssignExpr {
span: node.right.span(),
op: node.op,
left: left_of_right.into(),
right: node.right.take(),
});
} else {
node.right.visit_mut_with(self);
prop.visit_mut_with(self);
let prop = self.cache_expression(prop.expr.take());
left.obj = Box::new(Expr::Ident(obj));
left.prop = MemberProp::Computed(ComputedPropName {
span: prop_span,
expr: Box::new(Expr::Ident(prop)),
});
}
}
// [source]
}
_ => {
node.left.visit_mut_with(self);
}
}
if node.op != op!("=") {
let left_of_right = self.cache_expression(node.left.take().expect_expr());
node.right.visit_mut_with(self);
*e = Expr::Assign(AssignExpr {
span: node.right.span(),
op: node.op,
left: left_of_right.into(),
right: node.right.take(),
});
} else {
node.right.visit_mut_with(self);
}
}

View File

@ -1937,3 +1937,47 @@ test_exec!(
await res;
"
);
test!(
Syntax::default(),
|_| {
let mark = Mark::fresh(Mark::root());
es2015::<SingleThreadedComments>(mark, None, Default::default())
},
issue_7809,
r#"
function a(fn) {
return _a.apply(this, arguments);
}
function _a() {
_a = _async_to_generator(function*(fn) {
(yield fn()).a = 1;
});
return _a.apply(this, arguments);
}
"#,
r#"
function a(fn) {
return _a.apply(this, arguments);
}
function _a() {
_a = _async_to_generator(function(fn) {
return _ts_generator(this, function(_state) {
switch(_state.label){
case 0:
return [
4,
fn()
];
case 1:
_state.sent().a = 1;
return [
2
];
}
});
});
return _a.apply(this, arguments);
}
"#
);