From 27a132a9cb3821b2e000b3bdefea56d0d83374fd Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 7 Feb 2016 22:18:41 -0500 Subject: [PATCH 1/2] Add test for T3077 (Incorrect rest operator behavior for async arrow functions) --- .../rest-async-arrow-functions/actual.js | 9 ++++++++ .../rest-async-arrow-functions/expected.js | 23 +++++++++++++++++++ .../rest-async-arrow-functions/options.json | 3 +++ 3 files changed, 35 insertions(+) create mode 100644 packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/actual.js create mode 100644 packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/expected.js create mode 100644 packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/options.json diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/actual.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/actual.js new file mode 100644 index 0000000000..d9d167b0f0 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/actual.js @@ -0,0 +1,9 @@ +var concat = async (...arrs) => { + var x = arrs[0]; + var y = arrs[1]; +}; + +var x = async (...rest) => { + if (noNeedToWork) return 0; + return rest; +}; diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/expected.js new file mode 100644 index 0000000000..d3a4b46eab --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/expected.js @@ -0,0 +1,23 @@ +var concat = function () { + var ref = babelHelpers.asyncToGenerator(function* () { + var x = arguments.length <= 0 ? undefined : arguments[0]; + var y = arguments.length <= 1 ? undefined : arguments[1]; + }); + return function concat() { + return ref.apply(this, arguments); + }; +}(); + +var x = function () { + var ref = babelHelpers.asyncToGenerator(function* () { + for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) { + rest[_key] = arguments[_key]; + } + + if (noNeedToWork) return 0; + return rest; + }); + return function x() { + return ref.apply(this, arguments); + }; +}(); diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/options.json b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/options.json new file mode 100644 index 0000000000..f90a55dbb2 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-async-arrow-functions/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers", "transform-es2015-parameters", "transform-async-to-generator"] +} From a3bca783dd825b01afc539915422a59b461d7238 Mon Sep 17 00:00:00 2001 From: Erik Desjardins Date: Tue, 9 Feb 2016 12:51:10 -0500 Subject: [PATCH 2/2] Transformed generators for async function expressions should not be shadow functions --- packages/babel-helper-remap-async-to-generator/src/index.js | 6 ++++++ 1 file changed, 6 insertions(+) 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 d3650c066f..03c6eebeca 100644 --- a/packages/babel-helper-remap-async-to-generator/src/index.js +++ b/packages/babel-helper-remap-async-to-generator/src/index.js @@ -62,6 +62,12 @@ function plainFunction(path: NodePath, callId: Object) { node.async = false; node.generator = true; + // Either the wrapped generator is invoked with `.apply(this, arguments)` or it has no params, + // so it should capture `arguments` + if (node.shadow) { + // node.shadow may be `true` or an object + node.shadow = Object.assign({}, node.shadow, { arguments: false }); + } let asyncFnId = node.id; node.id = null;