From b3bcc18b8a53e915fe22706e6aef6ecf5546d5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 26 Oct 2022 23:47:46 +0200 Subject: [PATCH] Move the generator body to a gen IIFE when compiling its params --- .../test/fixtures/regression/4943/output.js | 6 ++-- .../src/params.ts | 2 +- .../fixtures/parameters/generator/input.ts | 6 ++++ .../parameters/generator/options.json | 3 ++ .../fixtures/parameters/generator/output.js | 12 ++++++++ .../plugins-integration/issue-15012/exec.js | 13 +++++++++ .../plugins-integration/issue-15012/input.js | 3 ++ .../issue-15012/options.json | 3 ++ .../plugins-integration/issue-15012/output.js | 28 +++++++++++++++++++ 9 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/input.ts create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/options.json create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/output.js create mode 100644 packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/exec.js create mode 100644 packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/input.js create mode 100644 packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/options.json create mode 100644 packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/output.js diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/4943/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/4943/output.js index 471233145afc..036d4585a2eb 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/4943/output.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/4943/output.js @@ -7,11 +7,13 @@ function foo(_x) { return _foo.apply(this, arguments); } function _foo() { - _foo = babelHelpers.asyncToGenerator(function* (_ref) { + _foo = babelHelpers.asyncToGenerator(function (_ref) { let a = _ref.a, _ref$b = _ref.b, b = _ref$b === void 0 ? mandatory("b") : _ref$b; - return Promise.resolve(b); + return function* () { + return Promise.resolve(b); + }(); }); return _foo.apply(this, arguments); } diff --git a/packages/babel-plugin-transform-parameters/src/params.ts b/packages/babel-plugin-transform-parameters/src/params.ts index b93351baf100..cb06d87bc934 100644 --- a/packages/babel-plugin-transform-parameters/src/params.ts +++ b/packages/babel-plugin-transform-parameters/src/params.ts @@ -154,7 +154,7 @@ export default function convertFunctionParams( // ensure it's a block, useful for arrow functions path.ensureBlock(); - if (state.needsOuterBinding || shadowedParams.size > 0) { + if (state.needsOuterBinding || shadowedParams.size > 0 || node.generator) { body.push(buildScopeIIFE(shadowedParams, path.node.body)); path.set("body", t.blockStatement(body as t.Statement[])); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/input.ts b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/input.ts new file mode 100644 index 000000000000..9f3e554ed96e --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/input.ts @@ -0,0 +1,6 @@ +function* fn(a, [], b = 2) { + yield a; + yield arguments; + yield this; + return b; +} diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/options.json b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/options.json new file mode 100644 index 000000000000..676b583cd0f5 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-parameters"] +} diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/output.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/output.js new file mode 100644 index 000000000000..b73f2c9a890f --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/generator/output.js @@ -0,0 +1,12 @@ +function fn(a, _ref) { + var _arguments = arguments, + _this = this; + let [] = _ref; + let b = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2; + return function* () { + yield a; + yield _arguments; + yield _this; + return b; + }(); +} diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/exec.js b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/exec.js new file mode 100644 index 000000000000..311980d37af9 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/exec.js @@ -0,0 +1,13 @@ +function* f([]) {} + +expect(() => f()).toThrow(); + +let called = false; +let run = false; +function* g(x = (called = true)) { + run = true; +} + +g(); +expect(called).toBe(true); +expect(run).toBe(false); \ No newline at end of file diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/input.js b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/input.js new file mode 100644 index 000000000000..4a73e767a59f --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/input.js @@ -0,0 +1,3 @@ +function* f([]) {} + +function* g(x = fn()) {} diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/options.json b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/options.json new file mode 100644 index 000000000000..002b4aa0d58e --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/options.json @@ -0,0 +1,3 @@ +{ + "presets": ["env"] +} diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/output.js b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/output.js new file mode 100644 index 000000000000..ddfdfaa2c8ac --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-15012/output.js @@ -0,0 +1,28 @@ +function f(_ref) { + var _ref2 = babelHelpers.toArray(_ref); + return /*#__PURE__*/babelHelpers.regeneratorRuntime().mark(function _callee() { + return babelHelpers.regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + case "end": + return _context.stop(); + } + } + }, _callee); + })(); +} +function g() { + var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : fn(); + return /*#__PURE__*/babelHelpers.regeneratorRuntime().mark(function _callee2() { + return babelHelpers.regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })(); +}