diff --git a/packages/babel-helper-remap-async-to-generator/src/for-await.js b/packages/babel-helper-remap-async-to-generator/src/for-await.js index 359eac3f6c..398ce6fb02 100644 --- a/packages/babel-helper-remap-async-to-generator/src/for-await.js +++ b/packages/babel-helper-remap-async-to-generator/src/for-await.js @@ -1,8 +1,7 @@ import * as t from "babel-types"; import template from "babel-template"; -import traverse from "babel-traverse"; -const buildForAwait = template(` +const awaitTemplate = ` function* wrapper() { var ITERATOR_COMPLETION = true; var ITERATOR_HAD_ERROR_KEY = false; @@ -33,30 +32,11 @@ const buildForAwait = template(` } } } -`); - -const forAwaitVisitor = { - noScope: true, - - Identifier(path, replacements) { - if (path.node.name in replacements) { - path.replaceInline(replacements[path.node.name]); - } - }, - - CallExpression(path, replacements) { - const callee = path.node.callee; - - // if no await wrapping is being applied, unwrap the call expression - if ( - t.isIdentifier(callee) && - callee.name === "AWAIT" && - !replacements.AWAIT - ) { - path.replaceWith(path.node.arguments[0]); - } - }, -}; +`; +const buildForAwait = template(awaitTemplate); +const buildForAwaitWithoutWrapping = template( + awaitTemplate.replace(/\bAWAIT\b/g, ""), +); export default function(path, helpers) { const { node, scope, parent } = path; @@ -78,9 +58,10 @@ export default function(path, helpers) { ]); } - let template = buildForAwait(); - - traverse(template, forAwaitVisitor, null, { + const build = helpers.wrapAwait + ? buildForAwait + : buildForAwaitWithoutWrapping; + let template = build({ ITERATOR_HAD_ERROR_KEY: scope.generateUidIdentifier("didIteratorError"), ITERATOR_COMPLETION: scope.generateUidIdentifier( "iteratorNormalCompletion", diff --git a/packages/babel-helper-remap-async-to-generator/src/index.js b/packages/babel-helper-remap-async-to-generator/src/index.js index f4aea8de6c..c34d0e5f8e 100644 --- a/packages/babel-helper-remap-async-to-generator/src/index.js +++ b/packages/babel-helper-remap-async-to-generator/src/index.js @@ -65,7 +65,6 @@ const awaitVisitor = { if (build.replaceParent) { path.parentPath.replaceWithMultiple(build.node); - path.remove(); } else { path.replaceWithMultiple(build.node); } diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/actual.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/actual.js new file mode 100644 index 0000000000..f3051abe2a --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/actual.js @@ -0,0 +1,3 @@ +(async () => { + for await (const [value] of iterable) {} +})() diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/expected.js new file mode 100644 index 0000000000..6f1a3b8103 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/expected.js @@ -0,0 +1,26 @@ +babelHelpers.asyncToGenerator(function* () { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = babelHelpers.asyncIterator(iterable), _step, _value; _step = yield _iterator.next(), _iteratorNormalCompletion = _step.done, _value = yield _step.value, !_iteratorNormalCompletion; _iteratorNormalCompletion = true) { + const _value2 = _value, + _value3 = babelHelpers.slicedToArray(_value2, 1), + value = _value3[0]; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + yield _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } +})(); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/options.json b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/options.json new file mode 100644 index 0000000000..d6a975fca9 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/5880/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-async-to-generator", + "transform-es2015-destructuring", + "syntax-async-generators" + ] +}