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 258f274d8b2f..fba15441e556 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/src/index.ts +++ b/packages/babel-plugin-proposal-async-generator-functions/src/index.ts @@ -64,11 +64,11 @@ export default declare(api => { t.inherits(loop, node); t.inherits(loop.body, node.body); - if (build.replaceParent) { - path.parentPath.replaceWithMultiple(build.node); - } else { - path.replaceWithMultiple(build.node); - } + const p = build.replaceParent ? path.parentPath : path; + p.replaceWithMultiple(build.node); + + // TODO: Avoid crawl + p.scope.parent.crawl(); }, }, environmentVisitor, diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/exec.js b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/exec.js new file mode 100644 index 000000000000..6b4efca96e9b --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/exec.js @@ -0,0 +1,11 @@ +const arr = []; +async function v(source = 2) { + for await (source of [1]) { + arr.push(source); + } + expect(source).toEqual(1); +} +return v().then(() => { + expect(arr).toEqual([1]); +}); + diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/input.js b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/input.js new file mode 100644 index 000000000000..00cc3b635df5 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/input.js @@ -0,0 +1,4 @@ +async function v(source = 2) { + for await (source of [1]) { + } +} diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/options.json b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/options.json new file mode 100644 index 000000000000..80c840b109e1 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/options.json @@ -0,0 +1,7 @@ +{ + "plugins": ["transform-parameters", "proposal-async-generator-functions"], + "parserOpts": { + "allowReturnOutsideFunction": true + }, + "minNodeVersion": "8.0.0" +} diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/output.js b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/output.js new file mode 100644 index 000000000000..fa168b0e1b32 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-11610/output.js @@ -0,0 +1,24 @@ +async function v() { + let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2; + var _iteratorAbruptCompletion = false; + var _didIteratorError = false; + var _iteratorError; + try { + for (var _iterator = babelHelpers.asyncIterator([1]), _step; _iteratorAbruptCompletion = !(_step = await _iterator.next()).done; _iteratorAbruptCompletion = false) { + source = _step.value; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (_iteratorAbruptCompletion && _iterator.return != null) { + await _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } +}