From 865eb93c2dd34ceb5ef7fbfae09242b435bc219e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 3 Jan 2019 20:33:44 +0100 Subject: [PATCH] [private methods] Define private methods before executing initializers (#9248) --- .../src/fields.js | 4 +-- .../before-fields/exec.js | 16 +++++++++ .../before-fields/input.js | 13 +++++++ .../before-fields/output.js | 33 ++++++++++++++++++ .../private-method/before-fields/exec.js | 16 +++++++++ .../private-method/before-fields/input.js | 13 +++++++ .../private-method/before-fields/output.js | 34 +++++++++++++++++++ 7 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/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 c1807bb132..a895e28310 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -366,7 +366,7 @@ export function buildFieldsInitNodes( ); break; case isInstance && isPrivate && isMethod && loose: - instanceNodes.push( + instanceNodes.unshift( buildPrivateMethodInitLoose( t.thisExpression(), prop, @@ -378,7 +378,7 @@ export function buildFieldsInitNodes( ); break; case isInstance && isPrivate && isMethod && !loose: - instanceNodes.push( + instanceNodes.unshift( buildPrivateInstanceMethodInitSpec( t.thisExpression(), prop, diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/exec.js new file mode 100644 index 0000000000..26caf2d02c --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/exec.js @@ -0,0 +1,16 @@ +class Cl { + prop = this.#method(1); + + #priv = this.#method(2); + + #method(x) { + return x; + } + + getPriv() { + return this.#priv; + } +} + +expect(new Cl().prop).toBe(1); +expect(new Cl().getPriv()).toBe(2); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/input.js new file mode 100644 index 0000000000..2fcb785746 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/input.js @@ -0,0 +1,13 @@ +class Cl { + prop = this.#method(1); + + #priv = this.#method(2); + + #method(x) { + return x; + } + + getPriv() { + return this.#priv; + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/output.js new file mode 100644 index 0000000000..60b5075fa1 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-loose/before-fields/output.js @@ -0,0 +1,33 @@ +var Cl = +/*#__PURE__*/ +function () { + "use strict"; + + function Cl() { + babelHelpers.classCallCheck(this, Cl); + Object.defineProperty(this, _method, { + value: _method2 + }); + this.prop = babelHelpers.classPrivateFieldLooseBase(this, _method)[_method](1); + Object.defineProperty(this, _priv, { + writable: true, + value: babelHelpers.classPrivateFieldLooseBase(this, _method)[_method](2) + }); + } + + babelHelpers.createClass(Cl, [{ + key: "getPriv", + value: function getPriv() { + return babelHelpers.classPrivateFieldLooseBase(this, _priv)[_priv]; + } + }]); + return Cl; +}(); + +var _priv = babelHelpers.classPrivateFieldLooseKey("priv"); + +var _method = babelHelpers.classPrivateFieldLooseKey("method"); + +var _method2 = function _method2(x) { + return x; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/exec.js new file mode 100644 index 0000000000..26caf2d02c --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/exec.js @@ -0,0 +1,16 @@ +class Cl { + prop = this.#method(1); + + #priv = this.#method(2); + + #method(x) { + return x; + } + + getPriv() { + return this.#priv; + } +} + +expect(new Cl().prop).toBe(1); +expect(new Cl().getPriv()).toBe(2); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/input.js new file mode 100644 index 0000000000..2fcb785746 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/input.js @@ -0,0 +1,13 @@ +class Cl { + prop = this.#method(1); + + #priv = this.#method(2); + + #method(x) { + return x; + } + + getPriv() { + return this.#priv; + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/output.js new file mode 100644 index 0000000000..905eb09682 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/before-fields/output.js @@ -0,0 +1,34 @@ +var Cl = +/*#__PURE__*/ +function () { + "use strict"; + + function Cl() { + babelHelpers.classCallCheck(this, Cl); + + _method.add(this); + + babelHelpers.defineProperty(this, "prop", babelHelpers.classPrivateMethodGet(this, _method, _method2).call(this, 1)); + + _priv.set(this, { + writable: true, + value: babelHelpers.classPrivateMethodGet(this, _method, _method2).call(this, 2) + }); + } + + babelHelpers.createClass(Cl, [{ + key: "getPriv", + value: function getPriv() { + return babelHelpers.classPrivateFieldGet(this, _priv); + } + }]); + return Cl; +}(); + +var _priv = new WeakMap(); + +var _method = new WeakSet(); + +var _method2 = function _method2(x) { + return x; +};