diff --git a/crates/swc/tests/tsc-references/emitter.forAwait(target=es2015).1.normal.js b/crates/swc/tests/tsc-references/emitter.forAwait(target=es2015).1.normal.js index 74a13640b86d..fd1b7cac2b92 100644 --- a/crates/swc/tests/tsc-references/emitter.forAwait(target=es2015).1.normal.js +++ b/crates/swc/tests/tsc-references/emitter.forAwait(target=es2015).1.normal.js @@ -89,7 +89,7 @@ function _f3() { } finally{ try { if (_iteratorAbruptCompletion && _iterator.return != null) { - yield _iterator.return(); + yield _await_async_generator(_iterator.return()); } } finally{ if (_didIteratorError) { @@ -124,7 +124,7 @@ function _f4() { } finally{ try { if (_iteratorAbruptCompletion && _iterator.return != null) { - yield _iterator.return(); + yield _await_async_generator(_iterator.return()); } } finally{ if (_didIteratorError) { @@ -197,7 +197,7 @@ function _f6() { } finally{ try { if (_iteratorAbruptCompletion && _iterator.return != null) { - yield _iterator.return(); + yield _await_async_generator(_iterator.return()); } } finally{ if (_didIteratorError) { @@ -234,7 +234,7 @@ function _f7() { } finally{ try { if (_iteratorAbruptCompletion && _iterator.return != null) { - yield _iterator.return(); + yield _await_async_generator(_iterator.return()); } } finally{ if (_didIteratorError) { diff --git a/crates/swc/tests/tsc-references/emitter.forAwait(target=es5).1.normal.js b/crates/swc/tests/tsc-references/emitter.forAwait(target=es5).1.normal.js index 17d18f81e909..daf8294eea62 100644 --- a/crates/swc/tests/tsc-references/emitter.forAwait(target=es5).1.normal.js +++ b/crates/swc/tests/tsc-references/emitter.forAwait(target=es5).1.normal.js @@ -266,7 +266,7 @@ function _f3() { ]; return [ 4, - _iterator.return() + _await_async_generator(_iterator.return()) ]; case 8: _state.sent(); @@ -366,7 +366,7 @@ function _f4() { ]; return [ 4, - _iterator.return() + _await_async_generator(_iterator.return()) ]; case 8: _state.sent(); @@ -569,7 +569,7 @@ function _f6() { ]; return [ 4, - _iterator.return() + _await_async_generator(_iterator.return()) ]; case 8: _state.sent(); @@ -670,7 +670,7 @@ function _f7() { ]; return [ 4, - _iterator.return() + _await_async_generator(_iterator.return()) ]; case 8: _state.sent(); diff --git a/crates/swc_ecma_compat_es2017/src/async_to_generator.rs b/crates/swc_ecma_compat_es2017/src/async_to_generator.rs index 150e961659ab..0a5058cad642 100644 --- a/crates/swc_ecma_compat_es2017/src/async_to_generator.rs +++ b/crates/swc_ecma_compat_es2017/src/async_to_generator.rs @@ -790,21 +790,34 @@ fn handle_await_for(stmt: &mut Stmt, is_async_generator: bool) { alt: None, }); + let iterator_return = Box::new(Expr::Call(CallExpr { + span: DUMMY_SP, + callee: iterator + .clone() + .make_member(quote_ident!("return")) + .as_callee(), + args: vec![], + type_args: Default::default(), + })); + // yield _iterator.return(); + // or + // yield _awaitAsyncGenerator(_iterator.return()); let yield_stmt = Stmt::Expr(ExprStmt { span: DUMMY_SP, expr: Box::new(Expr::Yield(YieldExpr { span: DUMMY_SP, delegate: false, - arg: Some(Box::new(Expr::Call(CallExpr { - span: DUMMY_SP, - callee: iterator - .clone() - .make_member(quote_ident!("return")) - .as_callee(), - args: Default::default(), - type_args: Default::default(), - }))), + arg: Some(if is_async_generator { + Box::new(Expr::Call(CallExpr { + span: DUMMY_SP, + callee: helper!(await_async_generator), + args: vec![iterator_return.as_arg()], + type_args: Default::default(), + })) + } else { + iterator_return + }), })), }); diff --git a/crates/swc_ecma_transforms_compat/tests/async-to-generator/issue-8805/1/exec.js b/crates/swc_ecma_transforms_compat/tests/async-to-generator/issue-8805/1/exec.js new file mode 100644 index 000000000000..c41bcf6dc25f --- /dev/null +++ b/crates/swc_ecma_transforms_compat/tests/async-to-generator/issue-8805/1/exec.js @@ -0,0 +1,20 @@ +async function* foo() { + yield 1 +} + +async function* bar(inputs, returnValues) { + for await (const input of inputs) { + if (!returnValues) { + return + } + yield input + } +} + +async function run() { + for await (const number of bar(foo(), true)) { + console.log(number) + } +} + +run() \ No newline at end of file diff --git a/crates/swc_ecma_transforms_compat/tests/async-to-generator/issue-8805/2/exec.js b/crates/swc_ecma_transforms_compat/tests/async-to-generator/issue-8805/2/exec.js new file mode 100644 index 000000000000..cba4a393be75 --- /dev/null +++ b/crates/swc_ecma_transforms_compat/tests/async-to-generator/issue-8805/2/exec.js @@ -0,0 +1,20 @@ +async function* foo() { + yield 1 +} + +async function* bar(inputs, returnValues) { + for await (const input of inputs) { + if (!returnValues) { + return + } + yield input + } +} + +async function run() { + for await (const value of bar(foo(), false)) { + console.log(value) + } +} + +run() \ No newline at end of file