From c11cdcb6d861b0f68b9e21bc831643249f291b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Mon, 19 Nov 2018 17:19:54 +0100 Subject: [PATCH] Fix recursive async function expressions (#9039) * Fix recursive async function expressions * Update fixtures --- .../misc/regression-2892/output.js | 6 ++++-- packages/babel-helper-wrap-function/src/index.js | 16 ++++++++++++++-- .../async-generators/expression/output.js | 6 ++++-- .../generator-kinds/expression-named/output.js | 6 ++++-- .../async-iife-with-regenerator-spec/output.js | 6 ++++-- .../async-iife-with-regenerator/output.js | 6 ++++-- .../async-to-generator/async-iife/output.js | 6 ++++-- .../named-expression/output.js | 6 ++++-- .../named-expression/output.js | 6 ++++-- .../test/fixtures/regression/8783/exec.js | 14 ++++++++++++++ .../test/fixtures/regression/8783/input.js | 4 ++++ .../test/fixtures/regression/8783/options.json | 6 ++++++ .../test/fixtures/regression/8783/output.js | 16 ++++++++++++++++ .../test/fixtures/regression/T6755/output.js | 6 ++++-- 14 files changed, 90 insertions(+), 20 deletions(-) create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/exec.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/input.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/options.json create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/output.js diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-2892/output.js b/packages/babel-core/test/fixtures/transformation/misc/regression-2892/output.js index 11385a0a000b..f901edd2ffd3 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/regression-2892/output.js +++ b/packages/babel-core/test/fixtures/transformation/misc/regression-2892/output.js @@ -43,9 +43,11 @@ function () { }, _callee, this); })); - return function bar() { + function bar() { return _bar.apply(this, arguments); - }; + } + + return bar; }() }]); diff --git a/packages/babel-helper-wrap-function/src/index.js b/packages/babel-helper-wrap-function/src/index.js index c05d80fc4fed..d36e9d267700 100644 --- a/packages/babel-helper-wrap-function/src/index.js +++ b/packages/babel-helper-wrap-function/src/index.js @@ -3,7 +3,7 @@ import nameFunction from "@babel/helper-function-name"; import template from "@babel/template"; import * as t from "@babel/types"; -const buildExpressionWrapper = template.expression(` +const buildAnonymousExpressionWrapper = template.expression(` (function () { var REF = FUNCTION; return function NAME(PARAMS) { @@ -12,6 +12,16 @@ const buildExpressionWrapper = template.expression(` })() `); +const buildNamedExpressionWrapper = template.expression(` + (function () { + var REF = FUNCTION; + function NAME(PARAMS) { + return REF.apply(this, arguments); + } + return NAME; + })() +`); + const buildDeclarationWrapper = template(` function NAME(PARAMS) { return REF.apply(this, arguments); } function REF() { @@ -53,7 +63,9 @@ function plainFunction(path: NodePath, callId: Object) { const functionId = node.id; const wrapper = isDeclaration ? buildDeclarationWrapper - : buildExpressionWrapper; + : functionId + ? buildNamedExpressionWrapper + : buildAnonymousExpressionWrapper; if (path.isArrowFunctionExpression()) { path.arrowFunctionToExpression(); diff --git a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/async-generators/expression/output.js b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/async-generators/expression/output.js index 4f0a62ea8267..de01998b51cb 100644 --- a/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/async-generators/expression/output.js +++ b/packages/babel-plugin-proposal-async-generator-functions/test/fixtures/async-generators/expression/output.js @@ -7,7 +7,9 @@ return 3; }); - return function agf() { + function agf() { return _agf.apply(this, arguments); - }; + } + + return agf; })(); diff --git a/packages/babel-plugin-proposal-function-sent/test/fixtures/generator-kinds/expression-named/output.js b/packages/babel-plugin-proposal-function-sent/test/fixtures/generator-kinds/expression-named/output.js index 5218365efa3a..206aa55c314b 100644 --- a/packages/babel-plugin-proposal-function-sent/test/fixtures/generator-kinds/expression-named/output.js +++ b/packages/babel-plugin-proposal-function-sent/test/fixtures/generator-kinds/expression-named/output.js @@ -7,7 +7,9 @@ const foo = function () { return _functionSent; }); - return function gen() { + function gen() { return _gen.apply(this, arguments); - }; + } + + return gen; }(); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife-with-regenerator-spec/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife-with-regenerator-spec/output.js index d036604c88eb..955534d65b5f 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife-with-regenerator-spec/output.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife-with-regenerator-spec/output.js @@ -50,9 +50,11 @@ regeneratorRuntime.mark(function _callee2() { }, _callee3, this); })); - return function notIIFE() { + function notIIFE() { return _notIIFE.apply(this, arguments); - }; + } + + return notIIFE; })(); /*#__PURE__*/ diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife-with-regenerator/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife-with-regenerator/output.js index 5cc5472121a2..c5018f985ee8 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife-with-regenerator/output.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife-with-regenerator/output.js @@ -47,9 +47,11 @@ regeneratorRuntime.mark(function _callee2() { }, _callee3, this); })); - return function notIIFE() { + function notIIFE() { return _notIIFE.apply(this, arguments); - }; + } + + return notIIFE; })(); /*#__PURE__*/ diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife/output.js index 293c2722a5c8..825c719c2d65 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife/output.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-iife/output.js @@ -11,9 +11,11 @@ babelHelpers.asyncToGenerator(function* () { yield 'ok'; }); - return function notIIFE() { + function notIIFE() { return _notIIFE.apply(this, arguments); - }; + } + + return notIIFE; })(); /*#__PURE__*/ diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/named-expression/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/named-expression/output.js index 2a8d624a4e2b..9dad5008a8ed 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/named-expression/output.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/named-expression/output.js @@ -5,7 +5,9 @@ function () { console.log(bar); }); - return function bar() { + function bar() { return _bar.apply(this, arguments); - }; + } + + return bar; }(); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/bluebird-coroutines/named-expression/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/bluebird-coroutines/named-expression/output.js index d84f51a71eac..7bbf45dac641 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/bluebird-coroutines/named-expression/output.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/bluebird-coroutines/named-expression/output.js @@ -7,7 +7,9 @@ function () { console.log(bar); }); - return function bar() { + function bar() { return _bar.apply(this, arguments); - }; + } + + return bar; }(); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/exec.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/exec.js new file mode 100644 index 000000000000..4feaef3d1ea4 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/exec.js @@ -0,0 +1,14 @@ +let log = []; + +let resolve; +const main = new Promise(r => { resolve = r }); + +(async function poll(count) { + log.push(await Promise.resolve(count)) + if (count < 3) setTimeout(poll, 10, count + 1); + else resolve(); +})(0) + +return main.then(() => { + expect(log).toEqual([0, 1, 2, 3]); +}); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/input.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/input.js new file mode 100644 index 000000000000..3dc7ee537238 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/input.js @@ -0,0 +1,4 @@ +(async function poll() { + console.log(await Promise.resolve('Hello')) + setTimeout(poll, 1000); +})(); \ No newline at end of file diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/options.json b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/options.json new file mode 100644 index 000000000000..37be843c6eed --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/options.json @@ -0,0 +1,6 @@ +{ + "plugins": ["transform-async-to-generator"], + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/output.js new file mode 100644 index 000000000000..39a8061003c9 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/8783/output.js @@ -0,0 +1,16 @@ +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +(function () { + var _poll = _asyncToGenerator(function* () { + console.log((yield Promise.resolve('Hello'))); + setTimeout(poll, 1000); + }); + + function poll() { + return _poll.apply(this, arguments); + } + + return poll; +})()(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/T6755/output.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/T6755/output.js index df342bc8fa27..78b2f572c4f7 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/regression/T6755/output.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/regression/T6755/output.js @@ -32,9 +32,11 @@ function () { }, _callee, this); })); - return function test1() { + function test1() { return _test.apply(this, arguments); - }; + } + + return test1; }(); _proto.test2 =