From d37c9586371fdf44c4a219db14b1cf8c1e111dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Mon, 4 Feb 2019 15:10:46 +0100 Subject: [PATCH] Transform private async and generator functions (#9423) --- .../src/fields.js | 10 ++++++++-- .../private-method-loose/async/exec.js | 13 +++++++++++++ .../private-method-loose/async/input.js | 9 +++++++++ .../private-method-loose/async/options.json | 11 +++++++++++ .../private-method-loose/async/output.js | 18 ++++++++++++++++++ .../private-method-loose/generator/exec.js | 14 ++++++++++++++ .../private-method-loose/generator/input.js | 10 ++++++++++ .../generator/options.json | 7 +++++++ .../private-method-loose/generator/output.js | 19 +++++++++++++++++++ .../fixtures/private-method/async/exec.js | 13 +++++++++++++ .../fixtures/private-method/async/input.js | 9 +++++++++ .../private-method/async/options.json | 11 +++++++++++ .../fixtures/private-method/async/output.js | 16 ++++++++++++++++ .../fixtures/private-method/generator/exec.js | 14 ++++++++++++++ .../private-method/generator/input.js | 10 ++++++++++ .../private-method/generator/options.json | 7 +++++++ .../private-method/generator/output.js | 17 +++++++++++++++++ 17 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/options.json create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/options.json create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/options.json create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/options.json create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/output.js diff --git a/packages/babel-helper-create-class-features-plugin/src/fields.js b/packages/babel-helper-create-class-features-plugin/src/fields.js index e75d291391..e12514786b 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -410,8 +410,14 @@ function buildPrivateInstanceMethodDeclaration(prop, privateNamesMap) { getterDeclared, setterDeclared, } = privateName; - const { params, body } = prop.node; - const methodValue = t.functionExpression(methodId, params, body); + const { params, body, generator, async } = prop.node; + const methodValue = t.functionExpression( + methodId, + params, + body, + generator, + async, + ); const isGetter = getId && !getterDeclared && params.length === 0; const isSetter = setId && !setterDeclared && params.length > 0; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/exec.js new file mode 100644 index 0000000000..168eb945dd --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/exec.js @@ -0,0 +1,13 @@ +class Cl { + async #foo() { + return 2; + } + + test() { + return this.#foo(); + } +} + +return new Cl().test().then(val => { + expect(val).toBe(2); +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/input.js new file mode 100644 index 0000000000..aed36e2561 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/input.js @@ -0,0 +1,9 @@ +class Cl { + async #foo() { + return 2; + } + + test() { + return this.#foo(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/options.json new file mode 100644 index 0000000000..580349bcb7 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/options.json @@ -0,0 +1,11 @@ +{ + "minNodeVersion": "8.0.0", + "plugins": [ + ["external-helpers", { "helperVersion": "7.1000.0" }], + ["proposal-private-methods", { "loose": true }], + ["proposal-class-properties", { "loose": true }] + ], + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/output.js new file mode 100644 index 0000000000..eeda4b5889 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/async/output.js @@ -0,0 +1,18 @@ +class Cl { + constructor() { + Object.defineProperty(this, _foo, { + value: _foo2 + }); + } + + test() { + return babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo](); + } + +} + +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +var _foo2 = async function _foo2() { + return 2; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/exec.js new file mode 100644 index 0000000000..472eadeabf --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/exec.js @@ -0,0 +1,14 @@ +class Cl { + *#foo() { + yield 2; + return 3; + } + + test() { + return this.#foo(); + } +} + +const val = new Cl().test(); +expect(val.next()).toEqual({ value: 2, done: false }); +expect(val.next()).toEqual({ value: 3, done: true }); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/input.js new file mode 100644 index 0000000000..39aace6dc4 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/input.js @@ -0,0 +1,10 @@ +class Cl { + *#foo() { + yield 2; + return 3; + } + + test() { + return this.#foo(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/options.json new file mode 100644 index 0000000000..d497a940ac --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.1000.0" }], + ["proposal-private-methods", { "loose": true }], + ["proposal-class-properties", { "loose": true }] + ] +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/output.js new file mode 100644 index 0000000000..a65255f8cf --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/generator/output.js @@ -0,0 +1,19 @@ +class Cl { + constructor() { + Object.defineProperty(this, _foo, { + value: _foo2 + }); + } + + test() { + return babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo](); + } + +} + +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +var _foo2 = function* _foo2() { + yield 2; + return 3; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/exec.js new file mode 100644 index 0000000000..168eb945dd --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/exec.js @@ -0,0 +1,13 @@ +class Cl { + async #foo() { + return 2; + } + + test() { + return this.#foo(); + } +} + +return new Cl().test().then(val => { + expect(val).toBe(2); +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/input.js new file mode 100644 index 0000000000..aed36e2561 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/input.js @@ -0,0 +1,9 @@ +class Cl { + async #foo() { + return 2; + } + + test() { + return this.#foo(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/options.json new file mode 100644 index 0000000000..d102004d87 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/options.json @@ -0,0 +1,11 @@ +{ + "minNodeVersion": "8.0.0", + "plugins": [ + ["external-helpers", { "helperVersion": "7.1000.0" }], + "proposal-private-methods", + "proposal-class-properties" + ], + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/output.js new file mode 100644 index 0000000000..7f6889735c --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/async/output.js @@ -0,0 +1,16 @@ +class Cl { + constructor() { + _foo.add(this); + } + + test() { + return babelHelpers.classPrivateMethodGet(this, _foo, _foo2).call(this); + } + +} + +var _foo = new WeakSet(); + +var _foo2 = async function _foo2() { + return 2; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/exec.js new file mode 100644 index 0000000000..472eadeabf --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/exec.js @@ -0,0 +1,14 @@ +class Cl { + *#foo() { + yield 2; + return 3; + } + + test() { + return this.#foo(); + } +} + +const val = new Cl().test(); +expect(val.next()).toEqual({ value: 2, done: false }); +expect(val.next()).toEqual({ value: 3, done: true }); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/input.js new file mode 100644 index 0000000000..39aace6dc4 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/input.js @@ -0,0 +1,10 @@ +class Cl { + *#foo() { + yield 2; + return 3; + } + + test() { + return this.#foo(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/options.json new file mode 100644 index 0000000000..df92baa99f --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.1000.0" }], + "proposal-private-methods", + "proposal-class-properties" + ] +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/output.js new file mode 100644 index 0000000000..be02820a85 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/generator/output.js @@ -0,0 +1,17 @@ +class Cl { + constructor() { + _foo.add(this); + } + + test() { + return babelHelpers.classPrivateMethodGet(this, _foo, _foo2).call(this); + } + +} + +var _foo = new WeakSet(); + +var _foo2 = function* _foo2() { + yield 2; + return 3; +};