From d4e23b5b2a46668ccf423e5f2e45363dfd1de341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 4 Sep 2018 08:10:46 +0200 Subject: [PATCH] [static private] Unify loose handling of static and instance props (#8614) --- packages/babel-helpers/src/helpers.js | 9 -- .../src/index.js | 99 +++++++------------ .../private-loose/native-classes/output.js | 12 +-- .../non-block-arrow-func/output.mjs | 10 +- .../private-loose/reevaluated/output.js | 14 ++- .../private-loose/static-call/output.js | 12 +-- .../private-loose/static-export/output.mjs | 22 +++-- .../private-loose/static-infer-name/output.js | 10 +- .../private-loose/static-inherited/output.js | 30 +++--- .../private-loose/static-undefined/output.js | 14 +-- .../fixtures/private-loose/static/output.js | 14 +-- 11 files changed, 102 insertions(+), 144 deletions(-) diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 225440975bd0..0b1114756e5f 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -1054,15 +1054,6 @@ helpers.classPrivateFieldSet = helper("7.0.0-beta.0")` } `; -helpers.classStaticPrivateFieldLooseBase = helper("7.0.1")` - export default function _classStaticPrivateFieldLooseBase(receiver, classConstructor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return classConstructor; - } -`; - helpers.classStaticPrivateFieldSpecGet = helper("7.0.1")` export default function _classStaticPrivateFieldSpecGet( receiver, classConstructor, privateClass, privateId diff --git a/packages/babel-plugin-proposal-class-properties/src/index.js b/packages/babel-plugin-proposal-class-properties/src/index.js index 7211a5796804..a4a975d50ffb 100644 --- a/packages/babel-plugin-proposal-class-properties/src/index.js +++ b/packages/babel-plugin-proposal-class-properties/src/index.js @@ -200,20 +200,6 @@ export default declare((api, options) => { }, }; - const staticPrivatePropertyHandlerLoose = { - handle(member) { - const { file, privateId, classRef } = this; - member.replaceWith( - template.expression`BASE(RECEIVER, CLASS).PRIVATE_ID`({ - BASE: file.addHelper("classStaticPrivateFieldLooseBase"), - RECEIVER: member.node.object, - CLASS: classRef, - PRIVATE_ID: privateId, - }), - ); - }, - }; - function buildClassPropertySpec(ref, path, state) { const { scope } = path; const { key, value, computed } = path.node; @@ -272,7 +258,7 @@ export default declare((api, options) => { }); } - function buildClassPrivatePropertyLoose(ref, path, initNodes, state) { + function buildClassPrivatePropertyLooseHelper(ref, path, state) { const { parentPath, scope } = path; const { name } = path.node.key.id; @@ -285,28 +271,45 @@ export default declare((api, options) => { ...privateNameHandlerLoose, }); - initNodes.push( - template.statement`var PROP = HELPER(NAME);`({ + return { + keyDecl: template.statement`var PROP = HELPER(NAME);`({ PROP: prop, HELPER: state.addHelper("classPrivateFieldLooseKey"), NAME: t.stringLiteral(name), }), + // Must be late evaluated in case it references another private field. + buildInit: () => + template.statement.ast` + Object.defineProperty(${ref}, ${prop}, { + // configurable is false by default + // enumerable is false by default + writable: true, + value: ${path.node.value || scope.buildUndefinedNode()} + }); + `, + }; + } + + function buildClassInstancePrivatePropertyLoose(ref, path, initNodes, state) { + const { keyDecl, buildInit } = buildClassPrivatePropertyLooseHelper( + ref, + path, + state, ); - // Must be late evaluated in case it references another private field. - return () => - template.statement` - Object.defineProperty(REF, PROP, { - // configurable is false by default - // enumerable is false by default - writable: true, - value: VALUE - }); - `({ - REF: ref, - PROP: prop, - VALUE: path.node.value || scope.buildUndefinedNode(), - }); + initNodes.push(keyDecl); + return buildInit; + } + + function buildClassStaticPrivatePropertyLoose(ref, path, state) { + const { keyDecl, buildInit } = buildClassPrivatePropertyLooseHelper( + ref, + path, + state, + ); + + const staticNodesToAdd = [keyDecl, buildInit()]; + return [staticNodesToAdd]; } function buildClassStaticPrivatePropertySpec( @@ -351,44 +354,12 @@ export default declare((api, options) => { return [staticNodesToAdd, privateClassId]; } - function buildClassStaticPrivatePropertyLoose(ref, path, state) { - const { scope, parentPath } = path; - const { key, value } = path.node; - const { name } = key.id; - const privateId = scope.generateUidIdentifier(name); - - parentPath.traverse(privateNameVisitor, { - name, - privateId, - classRef: ref, - file: state, - ...staticPrivatePropertyHandlerLoose, - }); - - const staticNodesToAdd = [ - template.statement` - Object.defineProperty(OBJ, KEY, { - value: VALUE, - enumerable: false, - configurable: false, - writable: true - }); - `({ - OBJ: ref, - KEY: t.stringLiteral(privateId.name), - VALUE: value || scope.buildUndefinedNode(), - }), - ]; - - return [staticNodesToAdd]; - } - const buildClassProperty = loose ? buildClassPropertyLoose : buildClassPropertySpec; const buildClassPrivateProperty = loose - ? buildClassPrivatePropertyLoose + ? buildClassInstancePrivatePropertyLoose : buildClassPrivatePropertySpec; const buildClassStaticPrivateProperty = loose diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/native-classes/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/native-classes/output.js index 9b3baaca50cf..33bfbfeff1b6 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/native-classes/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/native-classes/output.js @@ -7,7 +7,7 @@ class Foo { } static test() { - return babelHelpers.classStaticPrivateFieldLooseBase(Foo, Foo)._foo; + return babelHelpers.classPrivateFieldLooseBase(Foo, _foo)[_foo]; } test() { @@ -16,11 +16,11 @@ class Foo { } -Object.defineProperty(Foo, "_foo", { - value: "foo", - enumerable: false, - configurable: false, - writable: true +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +Object.defineProperty(Foo, _foo, { + writable: true, + value: "foo" }); var _bar = babelHelpers.classPrivateFieldLooseKey("bar"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/non-block-arrow-func/output.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/non-block-arrow-func/output.mjs index b08ae2f56ae6..ba8c7b5fab6d 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/non-block-arrow-func/output.mjs +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/non-block-arrow-func/output.mjs @@ -1,18 +1,16 @@ export default (param => { - var _class, _temp; + var _class, _temp, _props; return _temp = _class = class App { getParam() { return param; } - }, Object.defineProperty(_class, "_props", { + }, _props = babelHelpers.classPrivateFieldLooseKey("props"), Object.defineProperty(_class, _props, { + writable: true, value: { prop1: 'prop1', prop2: 'prop2' - }, - enumerable: false, - configurable: false, - writable: true + } }), _temp; }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/reevaluated/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/reevaluated/output.js index 2716ec67853d..2324c4ee3e2d 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/reevaluated/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/reevaluated/output.js @@ -1,5 +1,5 @@ function classFactory() { - var _class, _temp, _foo; + var _class, _temp, _foo, _bar; return _temp = _class = class Foo { constructor() { @@ -14,7 +14,7 @@ function classFactory() { } static() { - return babelHelpers.classStaticPrivateFieldLooseBase(Foo, _class)._bar; + return babelHelpers.classPrivateFieldLooseBase(Foo, _bar)[_bar]; } static instance(inst) { @@ -22,14 +22,12 @@ function classFactory() { } static static() { - return babelHelpers.classStaticPrivateFieldLooseBase(Foo, _class)._bar; + return babelHelpers.classPrivateFieldLooseBase(Foo, _bar)[_bar]; } - }, _foo = babelHelpers.classPrivateFieldLooseKey("foo"), Object.defineProperty(_class, "_bar", { - value: "bar", - enumerable: false, - configurable: false, - writable: true + }, _foo = babelHelpers.classPrivateFieldLooseKey("foo"), _bar = babelHelpers.classPrivateFieldLooseKey("bar"), Object.defineProperty(_class, _bar, { + writable: true, + value: "bar" }), _temp; } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-call/output.js index 32118df7e5c6..e130e89295ce 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-call/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-call/output.js @@ -10,17 +10,17 @@ function () { babelHelpers.createClass(Foo, [{ key: "test", value: function test(x) { - return babelHelpers.classStaticPrivateFieldLooseBase(Foo, Foo)._foo(x); + return babelHelpers.classPrivateFieldLooseBase(Foo, _foo)[_foo](x); } }]); return Foo; }(); -Object.defineProperty(Foo, "_foo", { +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +Object.defineProperty(Foo, _foo, { + writable: true, value: function (x) { return x; - }, - enumerable: false, - configurable: false, - writable: true + } }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-export/output.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-export/output.mjs index ce77229f9cf0..53baaa40d136 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-export/output.mjs +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-export/output.mjs @@ -1,14 +1,16 @@ export class MyClass {} -Object.defineProperty(MyClass, "_property", { - value: value, - enumerable: false, - configurable: false, - writable: true + +var _property = babelHelpers.classPrivateFieldLooseKey("property"); + +Object.defineProperty(MyClass, _property, { + writable: true, + value: value }); export default class MyClass2 {} -Object.defineProperty(MyClass2, "_property2", { - value: value, - enumerable: false, - configurable: false, - writable: true + +var _property2 = babelHelpers.classPrivateFieldLooseKey("property"); + +Object.defineProperty(MyClass2, _property2, { + writable: true, + value: value }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-infer-name/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-infer-name/output.js index f75395dfd35f..1728effa5292 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-infer-name/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-infer-name/output.js @@ -1,8 +1,6 @@ -var _class, _temp; +var _class, _temp, _num; -var Foo = (_temp = _class = class Foo {}, Object.defineProperty(_class, "_num", { - value: 0, - enumerable: false, - configurable: false, - writable: true +var Foo = (_temp = _class = class Foo {}, _num = babelHelpers.classPrivateFieldLooseKey("num"), Object.defineProperty(_class, _num, { + writable: true, + value: 0 }), _temp); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-inherited/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-inherited/output.js index 908ed1d020d8..0dbe51081fdf 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-inherited/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-inherited/output.js @@ -1,41 +1,41 @@ class Base { static getThis() { - return babelHelpers.classStaticPrivateFieldLooseBase(this, Base)._foo; + return babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]; } static updateThis(val) { - return babelHelpers.classStaticPrivateFieldLooseBase(this, Base)._foo = val; + return babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo] = val; } static getClass() { - return babelHelpers.classStaticPrivateFieldLooseBase(Base, Base)._foo; + return babelHelpers.classPrivateFieldLooseBase(Base, _foo)[_foo]; } static updateClass(val) { - return babelHelpers.classStaticPrivateFieldLooseBase(Base, Base)._foo = val; + return babelHelpers.classPrivateFieldLooseBase(Base, _foo)[_foo] = val; } } -Object.defineProperty(Base, "_foo", { - value: 1, - enumerable: false, - configurable: false, - writable: true +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +Object.defineProperty(Base, _foo, { + writable: true, + value: 1 }); class Sub1 extends Base { static update(val) { - return babelHelpers.classStaticPrivateFieldLooseBase(this, Sub1)._foo2 = val; + return babelHelpers.classPrivateFieldLooseBase(this, _foo2)[_foo2] = val; } } -Object.defineProperty(Sub1, "_foo2", { - value: 2, - enumerable: false, - configurable: false, - writable: true +var _foo2 = babelHelpers.classPrivateFieldLooseKey("foo"); + +Object.defineProperty(Sub1, _foo2, { + writable: true, + value: 2 }); class Sub2 extends Base {} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-undefined/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-undefined/output.js index a4b138fc3d7f..7f147ae78e11 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-undefined/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static-undefined/output.js @@ -1,17 +1,17 @@ class Foo { static test() { - return babelHelpers.classStaticPrivateFieldLooseBase(Foo, Foo)._bar; + return babelHelpers.classPrivateFieldLooseBase(Foo, _bar)[_bar]; } test() { - return babelHelpers.classStaticPrivateFieldLooseBase(Foo, Foo)._bar; + return babelHelpers.classPrivateFieldLooseBase(Foo, _bar)[_bar]; } } -Object.defineProperty(Foo, "_bar", { - value: void 0, - enumerable: false, - configurable: false, - writable: true +var _bar = babelHelpers.classPrivateFieldLooseKey("bar"); + +Object.defineProperty(Foo, _bar, { + writable: true, + value: void 0 }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static/output.js index 620fe4f20c62..18bcaf0c42bb 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/static/output.js @@ -1,17 +1,17 @@ class Foo { static test() { - return babelHelpers.classStaticPrivateFieldLooseBase(Foo, Foo)._bar; + return babelHelpers.classPrivateFieldLooseBase(Foo, _bar)[_bar]; } test() { - return babelHelpers.classStaticPrivateFieldLooseBase(Foo, Foo)._bar; + return babelHelpers.classPrivateFieldLooseBase(Foo, _bar)[_bar]; } } -Object.defineProperty(Foo, "_bar", { - value: "foo", - enumerable: false, - configurable: false, - writable: true +var _bar = babelHelpers.classPrivateFieldLooseKey("bar"); + +Object.defineProperty(Foo, _bar, { + writable: true, + value: "foo" });