diff --git a/packages/babel-plugin-proposal-async-generator-functions/src/index.ts b/packages/babel-plugin-proposal-async-generator-functions/src/index.ts index ff62c3b60bea..258f274d8b2f 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/src/index.ts +++ b/packages/babel-plugin-proposal-async-generator-functions/src/index.ts @@ -54,11 +54,13 @@ export default declare(api => { // add the value declaration to the new loop body if (declar) { block.body.push(declar); + if (path.node.body.body.length) { + block.body.push(t.blockStatement(path.node.body.body)); + } + } else { + block.body.push(...path.node.body.body); } - // push the rest of the original loop body onto our new body - block.body.push(...path.node.body.body); - t.inherits(loop, node); t.inherits(loop.body, node.body); diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js index 581d1f65d9f6..24f49ced2b8e 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-arrow/output.js @@ -5,7 +5,9 @@ try { for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { let x = _step.value; - f(x); + { + f(x); + } } } catch (err) { _didIteratorError = true; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js index 6335d1906b12..71ba36cddd42 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-function/output.js @@ -9,7 +9,9 @@ function _f() { try { for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { let x = _step.value; - g(x); + { + g(x); + } } } catch (err) { _didIteratorError = true; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js index ca5ff0805081..fc223a06bb69 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/async-generator/output.js @@ -9,7 +9,9 @@ function _g() { try { for (var _iterator = babelHelpers.asyncIterator(y), _step; _iteratorAbruptCompletion = !(_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done; _iteratorAbruptCompletion = false) { let x = _step.value; - f(x); + { + f(x); + } } } catch (err) { _didIteratorError = true; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/create-async-from-sync-iterator/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/create-async-from-sync-iterator/output.js index de733387be8b..155e38e9118c 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/create-async-from-sync-iterator/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/create-async-from-sync-iterator/output.js @@ -9,9 +9,11 @@ function _fn() { try { for (var _iterator = babelHelpers.asyncIterator([Promise.resolve("ok")]), _step; _iteratorAbruptCompletion = !(_step = yield babelHelpers.awaitAsyncGenerator(_iterator.next())).done; _iteratorAbruptCompletion = false) { const result = _step.value; - return { - result - }; + { + return { + result + }; + } } } catch (err) { _didIteratorError = true; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js index dbd63bef6c9d..3317e353043e 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/destructuring/output.js @@ -12,7 +12,9 @@ function _f() { x, y: [z] } = _step.value; - g(x, z); + { + g(x, z); + } } } catch (err) { _didIteratorError = true; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/exec.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/exec.js new file mode 100644 index 000000000000..85469cec8199 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/exec.js @@ -0,0 +1,3 @@ +( async () => { + for await ( let x of [ ] ) { let x; } +} ) ; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/input.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/input.js new file mode 100644 index 000000000000..85469cec8199 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/input.js @@ -0,0 +1,3 @@ +( async () => { + for await ( let x of [ ] ) { let x; } +} ) ; diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/output.js new file mode 100644 index 000000000000..f5368c0de258 --- /dev/null +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/for-await/re-declare-var-in-init-body/output.js @@ -0,0 +1,26 @@ +/*#__PURE__*/babelHelpers.asyncToGenerator(function* () { + var _iteratorAbruptCompletion = false; + var _didIteratorError = false; + var _iteratorError; + try { + for (var _iterator = babelHelpers.asyncIterator([]), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) { + let x = _step.value; + { + let x; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (_iteratorAbruptCompletion && _iterator.return != null) { + yield _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } +});