From eccf5d0e9478da2d52e214af2155543443623647 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Fri, 24 May 2019 00:34:04 +0800 Subject: [PATCH 01/11] destructuring private fields with array pattern / object pattern --- .../src/index.js | 20 +++++++++++ .../destructuring-array-pattern/exec.js | 14 ++++++++ .../destructuring-array-pattern/input.js | 14 ++++++++ .../destructuring-array-pattern/output.js | 33 +++++++++++++++++++ .../destructuring-object-pattern/exec.js | 14 ++++++++ .../destructuring-object-pattern/input.js | 7 ++++ .../destructuring-object-pattern/output.js | 20 +++++++++++ 7 files changed, 122 insertions(+) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js diff --git a/packages/babel-helper-member-expression-to-functions/src/index.js b/packages/babel-helper-member-expression-to-functions/src/index.js index e44c3eb78496..488cbdd0906c 100644 --- a/packages/babel-helper-member-expression-to-functions/src/index.js +++ b/packages/babel-helper-member-expression-to-functions/src/index.js @@ -100,6 +100,26 @@ const handle = { return; } + // { KEY: MEMBER } = OBJ -> { KEY: _ref } = OBJ; _set(MEMBER, _ref); + // [MEMBER] = ARR -> [_ref] = ARR; _set(MEMBER, _ref); + if ( + (parentPath.isObjectProperty({ value: node }) && + parentPath.parentPath.isObjectPattern()) || + parentPath.isArrayPattern() + ) { + const { scope } = member; + const ref = scope.generateUidIdentifierBasedOnNode(node); + scope.push({ id: ref }); + + const assignmentParent = parentPath.getStatementParent(); + assignmentParent.insertAfter( + t.expressionStatement(this.set(member, t.cloneNode(ref))), + ); + member.replaceWith(t.cloneNode(ref)); + + return; + } + // MEMBER -> _get(MEMBER) member.replaceWith(this.get(member)); }, diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/exec.js new file mode 100644 index 000000000000..33310d6da0ca --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;([this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo(['bar']); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js new file mode 100644 index 000000000000..33310d6da0ca --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;([this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo(['bar']); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js new file mode 100644 index 000000000000..5a286231089a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js @@ -0,0 +1,33 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo(props) { + var _this$client; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ; + [_this$client] = props; + babelHelpers.classPrivateFieldSet(this, _client, _this$client); + } + + babelHelpers.createClass(Foo, [{ + key: "getClient", + value: function getClient() { + return babelHelpers.classPrivateFieldGet(this, _client); + } + }]); + return Foo; +}(); + +var _client = new WeakMap(); + +var foo = new Foo(['bar']); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js new file mode 100644 index 000000000000..97a5263bdfb8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;({ client: this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ client: 'bar' }); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js new file mode 100644 index 000000000000..281626d43608 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ;({ client: this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js new file mode 100644 index 000000000000..658994b2b7da --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js @@ -0,0 +1,20 @@ +var Foo = function Foo(props) { + "use strict"; + + var _this$client; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ; + ({ + client: _this$client + } = props); + babelHelpers.classPrivateFieldSet(this, _client, _this$client); +}; + +var _client = new WeakMap(); From 3b4a973f75513800c8bbeefe2471bc07cf35eeba Mon Sep 17 00:00:00 2001 From: Li Hau Tan Date: Fri, 24 May 2019 10:51:09 +0800 Subject: [PATCH 02/11] wip: new test cases --- .../destructuring-array-pattern-1/exec.js | 17 +++++++++++ .../destructuring-array-pattern-1/input.js | 8 +++++ .../destructuring-array-pattern-1/output.js | 30 +++++++++++++++++++ .../destructuring-array-pattern-2/exec.js | 14 +++++++++ .../destructuring-array-pattern-2/input.js | 7 +++++ .../destructuring-array-pattern-2/output.js | 30 +++++++++++++++++++ .../destructuring-array-pattern/input.js | 7 ----- .../destructuring-array-pattern/output.js | 3 -- .../destructuring-object-pattern-1/exec.js | 14 +++++++++ .../destructuring-object-pattern-1/input.js | 8 +++++ .../destructuring-object-pattern-1/output.js | 20 +++++++++++++ .../destructuring-object-pattern-2/exec.js | 14 +++++++++ .../destructuring-object-pattern-2/input.js | 7 +++++ .../destructuring-object-pattern-2/output.js | 20 +++++++++++++ .../destructuring-object-pattern/exec.js | 7 +++-- 15 files changed, 194 insertions(+), 12 deletions(-) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/exec.js new file mode 100644 index 000000000000..e9b210909117 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/exec.js @@ -0,0 +1,17 @@ +class Foo { + #client + + constructor(props) { + this.#client = 1; + ;([this.x = this.#client, this.#client, this.y = this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo([undefined, 'bar']); +expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe(1); +expect(foo.y).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..37fd45b2c58d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js @@ -0,0 +1,8 @@ +class Foo { + #client + + constructor(props) { + this.#client = 1; + ;([this.x = this.#client, this.#client, this.y = this.#client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js new file mode 100644 index 000000000000..ccda72ebfc44 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js @@ -0,0 +1,30 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo(props) { + var _this$client; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ; + [_this$client] = props; + babelHelpers.classPrivateFieldSet(this, _client, _this$client); + } + + babelHelpers.createClass(Foo, [{ + key: "getClient", + value: function getClient() { + return babelHelpers.classPrivateFieldGet(this, _client); + } + }]); + return Foo; +}(); + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js new file mode 100644 index 000000000000..c6fab58d6e17 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;([x, ...this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo(['foo', 'bar', 'baz', 'quu']); +expect(foo.getClient()).toBe(['bar', 'baz', 'quu']); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js new file mode 100644 index 000000000000..01e9cb9d6178 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ;([x, ...this.#client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js new file mode 100644 index 000000000000..ccda72ebfc44 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js @@ -0,0 +1,30 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo(props) { + var _this$client; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ; + [_this$client] = props; + babelHelpers.classPrivateFieldSet(this, _client, _this$client); + } + + babelHelpers.createClass(Foo, [{ + key: "getClient", + value: function getClient() { + return babelHelpers.classPrivateFieldGet(this, _client); + } + }]); + return Foo; +}(); + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js index 33310d6da0ca..ee428b3c1a66 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js @@ -4,11 +4,4 @@ class Foo { constructor(props) { ;([this.#client] = props); } - - getClient() { - return this.#client; - } } - -const foo = new Foo(['bar']); -expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js index 5a286231089a..ccda72ebfc44 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js @@ -28,6 +28,3 @@ function () { }(); var _client = new WeakMap(); - -var foo = new Foo(['bar']); -expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js new file mode 100644 index 000000000000..97a5263bdfb8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;({ client: this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ client: 'bar' }); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..0917839f762f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js @@ -0,0 +1,8 @@ +class Foo { + #client + + constructor(props) { + this.#client = 'foo'; + ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js new file mode 100644 index 000000000000..658994b2b7da --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js @@ -0,0 +1,20 @@ +var Foo = function Foo(props) { + "use strict"; + + var _this$client; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ; + ({ + client: _this$client + } = props); + babelHelpers.classPrivateFieldSet(this, _client, _this$client); +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js new file mode 100644 index 000000000000..c09722949fe9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;({ x, ...this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ x: 'foo', y: 'bar', z: 'baz' }); +expect(foo.getClient()).toBe({ y: 'bar', z: 'baz' }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js new file mode 100644 index 000000000000..12f011c72f93 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ;({ x, ...this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js new file mode 100644 index 000000000000..658994b2b7da --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js @@ -0,0 +1,20 @@ +var Foo = function Foo(props) { + "use strict"; + + var _this$client; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ; + ({ + client: _this$client + } = props); + babelHelpers.classPrivateFieldSet(this, _client, _this$client); +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js index 97a5263bdfb8..64797efce7c9 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js @@ -2,7 +2,8 @@ class Foo { #client constructor(props) { - ;({ client: this.#client } = props) + this.#client = 'foo'; + ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) } getClient() { @@ -10,5 +11,7 @@ class Foo { } } -const foo = new Foo({ client: 'bar' }); +const foo = new Foo({ y: 'bar' }); expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe('foo'); +expect(foo.z).toBe('bar'); From b374e44996955c0087a2a0e29485b18368520561 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sat, 25 May 2019 22:54:20 +0800 Subject: [PATCH 03/11] destrucuring and rest for private properties --- .../src/fields.js | 13 +++++++ .../src/index.js | 20 ++++------- packages/babel-helpers/src/helpers.js | 28 +++++++++++++++ .../destructuring-array-pattern-1/output.js | 36 +++++++------------ .../destructuring-array-pattern-2/exec.js | 3 +- .../destructuring-array-pattern-2/output.js | 35 ++++++------------ .../destructuring-array-pattern/output.js | 35 ++++++------------ .../destructuring-object-pattern-1/exec.js | 7 ++-- .../destructuring-object-pattern-1/output.js | 10 +++--- .../destructuring-object-pattern-2/exec.js | 3 +- .../destructuring-object-pattern-2/output.js | 8 ++--- .../destructuring-object-pattern/exec.js | 7 ++-- .../destructuring-object-pattern/output.js | 7 ++-- 13 files changed, 106 insertions(+), 106 deletions(-) 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 b3d2ccff0ebd..c6fb3da40ded 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -211,6 +211,19 @@ const privateNameHandlerSpec = { ]); }, + destructureSet(member) { + const { privateNamesMap, file } = this; + const { name } = member.node.property.id; + const { id } = privateNamesMap.get(name); + return t.memberExpression( + t.callExpression(file.addHelper("classPrivateFieldDestructureSet"), [ + this.receiver(member), + t.cloneNode(id), + ]), + t.identifier("value"), + ); + }, + call(member, args) { // The first access (the get) should do the memo assignment. this.memoise(member, 1); diff --git a/packages/babel-helper-member-expression-to-functions/src/index.js b/packages/babel-helper-member-expression-to-functions/src/index.js index 488cbdd0906c..12fc683ed915 100644 --- a/packages/babel-helper-member-expression-to-functions/src/index.js +++ b/packages/babel-helper-member-expression-to-functions/src/index.js @@ -100,23 +100,17 @@ const handle = { return; } - // { KEY: MEMBER } = OBJ -> { KEY: _ref } = OBJ; _set(MEMBER, _ref); - // [MEMBER] = ARR -> [_ref] = ARR; _set(MEMBER, _ref); + // { KEY: MEMBER } = OBJ -> { KEY: _destructureSet(MEMBER) } = OBJ + // [MEMBER] = ARR -> [_destructureSet(MEMBER)] = ARR + // [...MEMBER] -> [..._destructureSet(MEMBER)] + // {...MEMBER} -> {..._destructureSet(MEMBER)} if ( (parentPath.isObjectProperty({ value: node }) && parentPath.parentPath.isObjectPattern()) || - parentPath.isArrayPattern() + parentPath.isArrayPattern() || + parentPath.isRestElement() ) { - const { scope } = member; - const ref = scope.generateUidIdentifierBasedOnNode(node); - scope.push({ id: ref }); - - const assignmentParent = parentPath.getStatementParent(); - assignmentParent.insertAfter( - t.expressionStatement(this.set(member, t.cloneNode(ref))), - ); - member.replaceWith(t.cloneNode(ref)); - + member.replaceWith(this.destructureSet(member)); return; } diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 99eab0132ad0..2ec01a579007 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -1104,6 +1104,34 @@ helpers.classPrivateFieldSet = helper("7.0.0-beta.0")` } `; +helpers.classPrivateFieldDestructureSet = helper("7.4.4")` + export default function _classPrivateFieldDestructureSet(receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + var descriptor = privateMap.get(receiver); + if (descriptor.set) { + if (!("__destrObj" in descriptor)) { + descriptor.__destrObj = { + set value(v) { + descriptor.set.call(receiver, v) + }, + }; + } + return descriptor.__destrObj; + } else { + if (!descriptor.writable) { + // This should only throw in strict mode, but class bodies are + // always strict and private fields can only be used inside + // class bodies. + throw new TypeError("attempted to set read only private field"); + } + + return descriptor; + } + } +`; + helpers.classStaticPrivateFieldSpecGet = helper("7.0.2")` export default function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js index ccda72ebfc44..7cfaa943cf89 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js @@ -1,30 +1,18 @@ -var Foo = -/*#__PURE__*/ -function () { - "use strict"; - - function Foo(props) { - var _this$client; +function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - babelHelpers.classCallCheck(this, Foo); +var Foo = function Foo(props) { + "use strict"; - _client.set(this, { - writable: true, - value: void 0 - }); + babelHelpers.classCallCheck(this, Foo); - ; - [_this$client] = props; - babelHelpers.classPrivateFieldSet(this, _client, _this$client); - } + _client.set(this, { + writable: true, + value: void 0 + }); - babelHelpers.createClass(Foo, [{ - key: "getClient", - value: function getClient() { - return babelHelpers.classPrivateFieldGet(this, _client); - } - }]); - return Foo; -}(); + babelHelpers.classPrivateFieldSet(this, _client, 1); + ; + [this.x = babelHelpers.classPrivateFieldGet(this, _client), _classPrivateFieldDestructureSet(this, _client).value, this.y = babelHelpers.classPrivateFieldGet(this, _client)] = props; +}; var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js index c6fab58d6e17..c502fd3c3dc0 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js @@ -2,6 +2,7 @@ class Foo { #client constructor(props) { + let x; ;([x, ...this.#client] = props); } @@ -11,4 +12,4 @@ class Foo { } const foo = new Foo(['foo', 'bar', 'baz', 'quu']); -expect(foo.getClient()).toBe(['bar', 'baz', 'quu']); +expect(foo.getClient()).toEqual(['bar', 'baz', 'quu']); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js index ccda72ebfc44..9701f71cc023 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js @@ -1,30 +1,17 @@ -var Foo = -/*#__PURE__*/ -function () { - "use strict"; - - function Foo(props) { - var _this$client; +function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - babelHelpers.classCallCheck(this, Foo); +var Foo = function Foo(props) { + "use strict"; - _client.set(this, { - writable: true, - value: void 0 - }); + babelHelpers.classCallCheck(this, Foo); - ; - [_this$client] = props; - babelHelpers.classPrivateFieldSet(this, _client, _this$client); - } + _client.set(this, { + writable: true, + value: void 0 + }); - babelHelpers.createClass(Foo, [{ - key: "getClient", - value: function getClient() { - return babelHelpers.classPrivateFieldGet(this, _client); - } - }]); - return Foo; -}(); + ; + [x, ..._classPrivateFieldDestructureSet(this, _client).value] = props; +}; var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js index ccda72ebfc44..31a06aeb6e38 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js @@ -1,30 +1,17 @@ -var Foo = -/*#__PURE__*/ -function () { - "use strict"; - - function Foo(props) { - var _this$client; +function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - babelHelpers.classCallCheck(this, Foo); +var Foo = function Foo(props) { + "use strict"; - _client.set(this, { - writable: true, - value: void 0 - }); + babelHelpers.classCallCheck(this, Foo); - ; - [_this$client] = props; - babelHelpers.classPrivateFieldSet(this, _client, _this$client); - } + _client.set(this, { + writable: true, + value: void 0 + }); - babelHelpers.createClass(Foo, [{ - key: "getClient", - value: function getClient() { - return babelHelpers.classPrivateFieldGet(this, _client); - } - }]); - return Foo; -}(); + ; + [_classPrivateFieldDestructureSet(this, _client).value] = props; +}; var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js index 97a5263bdfb8..64797efce7c9 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js @@ -2,7 +2,8 @@ class Foo { #client constructor(props) { - ;({ client: this.#client } = props) + this.#client = 'foo'; + ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) } getClient() { @@ -10,5 +11,7 @@ class Foo { } } -const foo = new Foo({ client: 'bar' }); +const foo = new Foo({ y: 'bar' }); expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe('foo'); +expect(foo.z).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js index 658994b2b7da..294c47a4a670 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js @@ -1,8 +1,8 @@ +function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } + var Foo = function Foo(props) { "use strict"; - var _this$client; - babelHelpers.classCallCheck(this, Foo); _client.set(this, { @@ -10,11 +10,13 @@ var Foo = function Foo(props) { value: void 0 }); + babelHelpers.classPrivateFieldSet(this, _client, 'foo'); ; ({ - client: _this$client + x: this.x = babelHelpers.classPrivateFieldGet(this, _client), + y: _classPrivateFieldDestructureSet(this, _client).value, + z: this.z = babelHelpers.classPrivateFieldGet(this, _client) } = props); - babelHelpers.classPrivateFieldSet(this, _client, _this$client); }; var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js index c09722949fe9..944db11a8f3e 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js @@ -2,6 +2,7 @@ class Foo { #client constructor(props) { + let x; ;({ x, ...this.#client } = props) } @@ -11,4 +12,4 @@ class Foo { } const foo = new Foo({ x: 'foo', y: 'bar', z: 'baz' }); -expect(foo.getClient()).toBe({ y: 'bar', z: 'baz' }); +expect(foo.getClient()).toEqual({ y: 'bar', z: 'baz' }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js index 658994b2b7da..7a3e10fac78d 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js @@ -1,8 +1,8 @@ +function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } + var Foo = function Foo(props) { "use strict"; - var _this$client; - babelHelpers.classCallCheck(this, Foo); _client.set(this, { @@ -12,9 +12,9 @@ var Foo = function Foo(props) { ; ({ - client: _this$client + x, + ..._classPrivateFieldDestructureSet(this, _client).value } = props); - babelHelpers.classPrivateFieldSet(this, _client, _this$client); }; var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js index 64797efce7c9..97a5263bdfb8 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js @@ -2,8 +2,7 @@ class Foo { #client constructor(props) { - this.#client = 'foo'; - ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + ;({ client: this.#client } = props) } getClient() { @@ -11,7 +10,5 @@ class Foo { } } -const foo = new Foo({ y: 'bar' }); +const foo = new Foo({ client: 'bar' }); expect(foo.getClient()).toBe('bar'); -expect(foo.x).toBe('foo'); -expect(foo.z).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js index 658994b2b7da..111b0da6dafe 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js @@ -1,8 +1,8 @@ +function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } + var Foo = function Foo(props) { "use strict"; - var _this$client; - babelHelpers.classCallCheck(this, Foo); _client.set(this, { @@ -12,9 +12,8 @@ var Foo = function Foo(props) { ; ({ - client: _this$client + client: _classPrivateFieldDestructureSet(this, _client).value } = props); - babelHelpers.classPrivateFieldSet(this, _client, _this$client); }; var _client = new WeakMap(); From 17720675ca60902c5d94c4048559859651042b02 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sun, 26 May 2019 10:01:28 +0800 Subject: [PATCH 04/11] test case for loose private-loose --- .../destructuring-array-pattern-1/exec.js | 17 +++++++++++++++++ .../destructuring-array-pattern-1/input.js | 8 ++++++++ .../destructuring-array-pattern-1/output.js | 14 ++++++++++++++ .../destructuring-array-pattern-2/exec.js | 15 +++++++++++++++ .../destructuring-array-pattern-2/input.js | 7 +++++++ .../destructuring-array-pattern-2/output.js | 13 +++++++++++++ .../destructuring-array-pattern/exec.js | 14 ++++++++++++++ .../destructuring-array-pattern/input.js | 7 +++++++ .../destructuring-array-pattern/output.js | 13 +++++++++++++ .../destructuring-object-pattern-1/exec.js | 17 +++++++++++++++++ .../destructuring-object-pattern-1/input.js | 8 ++++++++ .../destructuring-object-pattern-1/output.js | 18 ++++++++++++++++++ .../destructuring-object-pattern-2/exec.js | 15 +++++++++++++++ .../destructuring-object-pattern-2/input.js | 7 +++++++ .../destructuring-object-pattern-2/output.js | 16 ++++++++++++++++ .../destructuring-object-pattern/exec.js | 14 ++++++++++++++ .../destructuring-object-pattern/input.js | 7 +++++++ .../destructuring-object-pattern/output.js | 15 +++++++++++++++ 18 files changed, 225 insertions(+) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/exec.js new file mode 100644 index 000000000000..e9b210909117 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/exec.js @@ -0,0 +1,17 @@ +class Foo { + #client + + constructor(props) { + this.#client = 1; + ;([this.x = this.#client, this.#client, this.y = this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo([undefined, 'bar']); +expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe(1); +expect(foo.y).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..37fd45b2c58d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js @@ -0,0 +1,8 @@ +class Foo { + #client + + constructor(props) { + this.#client = 1; + ;([this.x = this.#client, this.#client, this.y = this.#client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js new file mode 100644 index 000000000000..11b250ca1547 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js @@ -0,0 +1,14 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 1; + ; + [this.x = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], this.y = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/exec.js new file mode 100644 index 000000000000..c502fd3c3dc0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/exec.js @@ -0,0 +1,15 @@ +class Foo { + #client + + constructor(props) { + let x; + ;([x, ...this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo(['foo', 'bar', 'baz', 'quu']); +expect(foo.getClient()).toEqual(['bar', 'baz', 'quu']); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js new file mode 100644 index 000000000000..01e9cb9d6178 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ;([x, ...this.#client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js new file mode 100644 index 000000000000..c3bf863b5b4e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js @@ -0,0 +1,13 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + ; + [x, ...babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/exec.js new file mode 100644 index 000000000000..33310d6da0ca --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;([this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo(['bar']); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js new file mode 100644 index 000000000000..ee428b3c1a66 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ;([this.#client] = props); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js new file mode 100644 index 000000000000..2511c128b05d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js @@ -0,0 +1,13 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + ; + [babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/exec.js new file mode 100644 index 000000000000..64797efce7c9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/exec.js @@ -0,0 +1,17 @@ +class Foo { + #client + + constructor(props) { + this.#client = 'foo'; + ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ y: 'bar' }); +expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe('foo'); +expect(foo.z).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..0917839f762f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js @@ -0,0 +1,8 @@ +class Foo { + #client + + constructor(props) { + this.#client = 'foo'; + ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js new file mode 100644 index 000000000000..8bda80786821 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js @@ -0,0 +1,18 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 'foo'; + ; + ({ + x: this.x = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], + y: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], + z: this.z = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] + } = props); +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/exec.js new file mode 100644 index 000000000000..944db11a8f3e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/exec.js @@ -0,0 +1,15 @@ +class Foo { + #client + + constructor(props) { + let x; + ;({ x, ...this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ x: 'foo', y: 'bar', z: 'baz' }); +expect(foo.getClient()).toEqual({ y: 'bar', z: 'baz' }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js new file mode 100644 index 000000000000..12f011c72f93 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ;({ x, ...this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js new file mode 100644 index 000000000000..353eca713311 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js @@ -0,0 +1,16 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + ; + ({ + x, + ...babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] + } = props); +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/exec.js new file mode 100644 index 000000000000..97a5263bdfb8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;({ client: this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ client: 'bar' }); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js new file mode 100644 index 000000000000..281626d43608 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ;({ client: this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js new file mode 100644 index 000000000000..7a65e44ae0d3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js @@ -0,0 +1,15 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + ; + ({ + client: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] + } = props); +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); From 767365810952f2e4929655766f62c0ac491ca3a7 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sun, 26 May 2019 10:09:04 +0800 Subject: [PATCH 05/11] add transform-desturcturing for exec --- .../exec.js | 0 .../options.json | 15 +++++++++++++++ .../exec.js | 0 .../options.json | 15 +++++++++++++++ .../test/fixtures/private/options.json | 2 +- 5 files changed, 31 insertions(+), 1 deletion(-) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{destructuring-object-pattern-2 => destructuring-object-pattern-2-exec}/exec.js (100%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/options.json rename packages/babel-plugin-proposal-class-properties/test/fixtures/private/{destructuring-object-pattern-2 => destructuring-object-pattern-2-exec}/exec.js (100%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/options.json diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/exec.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/exec.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/exec.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/options.json new file mode 100644 index 000000000000..4a36349a0499 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/options.json @@ -0,0 +1,15 @@ +{ + "plugins": [ + "transform-destructuring", + [ + "external-helpers", + { + "helperVersion": "7.4.4" + } + ], + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/exec.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/exec.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/exec.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/options.json new file mode 100644 index 000000000000..4a36349a0499 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/options.json @@ -0,0 +1,15 @@ +{ + "plugins": [ + "transform-destructuring", + [ + "external-helpers", + { + "helperVersion": "7.4.4" + } + ], + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/options.json index beb3d1d5c569..5e2180d412eb 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/options.json +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/options.json @@ -3,7 +3,7 @@ [ "external-helpers", { - "helperVersion": "7.0.2" + "helperVersion": "7.4.4" } ], "proposal-class-properties", From 29b6f54c22b5e6318fc2b1cbcf4c5e460926de5c Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sun, 26 May 2019 11:31:08 +0800 Subject: [PATCH 06/11] update test case --- .../fixtures/private/destructuring-array-pattern-1/output.js | 4 +--- .../fixtures/private/destructuring-array-pattern-2/output.js | 4 +--- .../fixtures/private/destructuring-array-pattern/output.js | 4 +--- .../fixtures/private/destructuring-object-pattern-1/output.js | 4 +--- .../fixtures/private/destructuring-object-pattern-2/output.js | 4 +--- .../fixtures/private/destructuring-object-pattern/output.js | 4 +--- 6 files changed, 6 insertions(+), 18 deletions(-) diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js index 7cfaa943cf89..a0843639f55a 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js @@ -1,5 +1,3 @@ -function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - var Foo = function Foo(props) { "use strict"; @@ -12,7 +10,7 @@ var Foo = function Foo(props) { babelHelpers.classPrivateFieldSet(this, _client, 1); ; - [this.x = babelHelpers.classPrivateFieldGet(this, _client), _classPrivateFieldDestructureSet(this, _client).value, this.y = babelHelpers.classPrivateFieldGet(this, _client)] = props; + [this.x = babelHelpers.classPrivateFieldGet(this, _client), babelHelpers.classPrivateFieldDestructureSet(this, _client).value, this.y = babelHelpers.classPrivateFieldGet(this, _client)] = props; }; var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js index 9701f71cc023..6b6ded747e55 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js @@ -1,5 +1,3 @@ -function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - var Foo = function Foo(props) { "use strict"; @@ -11,7 +9,7 @@ var Foo = function Foo(props) { }); ; - [x, ..._classPrivateFieldDestructureSet(this, _client).value] = props; + [x, ...babelHelpers.classPrivateFieldDestructureSet(this, _client).value] = props; }; var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js index 31a06aeb6e38..f156f89acc5a 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js @@ -1,5 +1,3 @@ -function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - var Foo = function Foo(props) { "use strict"; @@ -11,7 +9,7 @@ var Foo = function Foo(props) { }); ; - [_classPrivateFieldDestructureSet(this, _client).value] = props; + [babelHelpers.classPrivateFieldDestructureSet(this, _client).value] = props; }; var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js index 294c47a4a670..5fe723f2fb25 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js @@ -1,5 +1,3 @@ -function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - var Foo = function Foo(props) { "use strict"; @@ -14,7 +12,7 @@ var Foo = function Foo(props) { ; ({ x: this.x = babelHelpers.classPrivateFieldGet(this, _client), - y: _classPrivateFieldDestructureSet(this, _client).value, + y: babelHelpers.classPrivateFieldDestructureSet(this, _client).value, z: this.z = babelHelpers.classPrivateFieldGet(this, _client) } = props); }; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js index 7a3e10fac78d..f903c8058189 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js @@ -1,5 +1,3 @@ -function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - var Foo = function Foo(props) { "use strict"; @@ -13,7 +11,7 @@ var Foo = function Foo(props) { ; ({ x, - ..._classPrivateFieldDestructureSet(this, _client).value + ...babelHelpers.classPrivateFieldDestructureSet(this, _client).value } = props); }; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js index 111b0da6dafe..4ef881446880 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js @@ -1,5 +1,3 @@ -function _classPrivateFieldDestructureSet(receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } var descriptor = privateMap.get(receiver); if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } - var Foo = function Foo(props) { "use strict"; @@ -12,7 +10,7 @@ var Foo = function Foo(props) { ; ({ - client: _classPrivateFieldDestructureSet(this, _client).value + client: babelHelpers.classPrivateFieldDestructureSet(this, _client).value } = props); }; From 94f7d2f791ce6cba16fd62804e1cf0945613786e Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sun, 26 May 2019 12:13:54 +0800 Subject: [PATCH 07/11] remove getPrototypeOf imports from get and set --- packages/babel-helpers/src/helpers.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 2ec01a579007..69fcfc1f2684 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -701,7 +701,6 @@ helpers.superPropBase = helper("7.0.0-beta.0")` `; helpers.get = helper("7.0.0-beta.0")` - import getPrototypeOf from "getPrototypeOf"; import superPropBase from "superPropBase"; export default function _get(target, property, receiver) { @@ -726,7 +725,6 @@ helpers.get = helper("7.0.0-beta.0")` `; helpers.set = helper("7.0.0-beta.0")` - import getPrototypeOf from "getPrototypeOf"; import superPropBase from "superPropBase"; import defineProperty from "defineProperty"; From d344e8d7e581082e8d756ed5ee4e6c8de53ae723 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sun, 26 May 2019 12:26:02 +0800 Subject: [PATCH 08/11] wip: destructure super assignment --- packages/babel-helper-replace-supers/src/index.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 2e445c0c76e8..69ceb28ed51c 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -125,6 +125,10 @@ const specHandlers = { ]); }, + destructureSet() { + // TODO + }, + call(superMember, args) { return optimiseCall(this.get(superMember), t.thisExpression(), args); }, @@ -174,6 +178,13 @@ const looseHandlers = { value, ); }, + + destructureSet(superMember) { + const { computed } = superMember.node; + const prop = this.prop(superMember); + + return t.memberExpression(t.thisExpression(), prop, computed); + }, }; export default class ReplaceSupers { From 692eee35c3f16d8abd0952f159f7ba25dd051502 Mon Sep 17 00:00:00 2001 From: Li Hau Tan Date: Mon, 27 May 2019 12:15:28 +0800 Subject: [PATCH 09/11] throw "Destructuring to a super field is not supported yet." --- .../babel-helper-replace-supers/src/index.js | 6 ++++-- .../input.js | 5 +++++ .../options.json | 10 ++++++++++ .../input.js | 5 +++++ .../options.json | 10 ++++++++++ .../input.js | 5 +++++ .../options.json | 10 ++++++++++ .../input.js | 5 +++++ .../options.json | 10 ++++++++++ .../input.js | 5 +++++ .../output.js | 16 ++++++++++++++++ .../input.js | 5 +++++ .../output.js | 16 ++++++++++++++++ .../input.js | 5 +++++ .../output.js | 19 +++++++++++++++++++ .../input.js | 5 +++++ .../output.js | 18 ++++++++++++++++++ .../input.js | 5 +++++ .../options.json | 10 ++++++++++ .../input.js | 5 +++++ .../options.json | 10 ++++++++++ .../input.js | 5 +++++ .../options.json | 10 ++++++++++ .../input.js | 5 +++++ .../options.json | 10 ++++++++++ .../input.js | 5 +++++ .../options.json | 8 ++++++++ .../input.js | 5 +++++ .../options.json | 8 ++++++++ .../input.js | 5 +++++ .../options.json | 8 ++++++++ .../input.js | 5 +++++ .../options.json | 8 ++++++++ 33 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/options.json create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/options.json create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/options.json create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/options.json create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/options.json create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/options.json create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/options.json create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/options.json create mode 100644 packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/input.js create mode 100644 packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/options.json create mode 100644 packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/input.js create mode 100644 packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/options.json create mode 100644 packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/input.js create mode 100644 packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/options.json create mode 100644 packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/input.js create mode 100644 packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/options.json diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 69ceb28ed51c..3412d321caf2 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -125,8 +125,10 @@ const specHandlers = { ]); }, - destructureSet() { - // TODO + destructureSet(superMember) { + throw superMember.buildCodeFrameError( + `Destructuring to a super field is not supported yet.`, + ); }, call(superMember, args) { diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..bc8f7e6aa311 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;([x, ...super.client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/options.json new file mode 100644 index 000000000000..d9d73e427633 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/input.js new file mode 100644 index 000000000000..aa6fb16c74d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;([super.client] = props); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/options.json new file mode 100644 index 000000000000..d9d73e427633 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..19705340451c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;({ x, ...super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/options.json new file mode 100644 index 000000000000..d9d73e427633 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/input.js new file mode 100644 index 000000000000..45845d4e16b5 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;({ client: super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/options.json new file mode 100644 index 000000000000..d9d73e427633 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..5b3864b52b67 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + foo(props) { + ;([x, ...super.client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/output.js new file mode 100644 index 000000000000..79753b87162a --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/output.js @@ -0,0 +1,16 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo() {} + + var _proto = Foo.prototype; + + _proto.foo = function foo(props) { + ; + [x, ...this.client] = props; + }; + + return Foo; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/input.js new file mode 100644 index 000000000000..96267163e8ad --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + foo(props) { + ;([super.client] = props); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/output.js new file mode 100644 index 000000000000..0672ad62fdab --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/output.js @@ -0,0 +1,16 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo() {} + + var _proto = Foo.prototype; + + _proto.foo = function foo(props) { + ; + [this.client] = props; + }; + + return Foo; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..f90c1a21039d --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + foo(props) { + ;({ x, ...super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/output.js new file mode 100644 index 000000000000..896273e40f43 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/output.js @@ -0,0 +1,19 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo() {} + + var _proto = Foo.prototype; + + _proto.foo = function foo(props) { + ; + ({ + x, + ...this.client + } = props); + }; + + return Foo; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/input.js new file mode 100644 index 000000000000..391378c2af5e --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + foo(props) { + ;({ client: super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/output.js new file mode 100644 index 000000000000..816071362136 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/output.js @@ -0,0 +1,18 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo() {} + + var _proto = Foo.prototype; + + _proto.foo = function foo(props) { + ; + ({ + client: this.client + } = props); + }; + + return Foo; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..bc8f7e6aa311 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;([x, ...super.client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/options.json new file mode 100644 index 000000000000..15c260b243c0 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/input.js new file mode 100644 index 000000000000..aa6fb16c74d4 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;([super.client] = props); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/options.json new file mode 100644 index 000000000000..15c260b243c0 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..19705340451c --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;({ x, ...super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/options.json new file mode 100644 index 000000000000..15c260b243c0 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/input.js new file mode 100644 index 000000000000..45845d4e16b5 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;({ client: super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/options.json new file mode 100644 index 000000000000..15c260b243c0 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/input.js b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..e9757ea1ef41 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/input.js @@ -0,0 +1,5 @@ +const foo = { + bar(props) { + ;([x, ...super.client] = props); + } +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/options.json b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/options.json new file mode 100644 index 000000000000..7975cd686c73 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-object-super", + "transform-shorthand-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/input.js b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/input.js new file mode 100644 index 000000000000..e4ee0d05beb8 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/input.js @@ -0,0 +1,5 @@ +const foo = { + bar(props) { + ;([super.client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/options.json b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/options.json new file mode 100644 index 000000000000..7975cd686c73 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-object-super", + "transform-shorthand-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/input.js b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..232d42042fdc --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/input.js @@ -0,0 +1,5 @@ +const foo = { + bar(props) { + ;({ x, ...super.client } = props) + } +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/options.json b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/options.json new file mode 100644 index 000000000000..7975cd686c73 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-object-super", + "transform-shorthand-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/input.js b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/input.js new file mode 100644 index 000000000000..5400ca56b6b6 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/input.js @@ -0,0 +1,5 @@ +const foo = { + bar(props) { + ;({ client: super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/options.json b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/options.json new file mode 100644 index 000000000000..7975cd686c73 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-object-super", + "transform-shorthand-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} From ab1e2e293ef451e39a5f3f5b582ec8fd8d831b40 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sun, 2 Jun 2019 11:16:44 +0800 Subject: [PATCH 10/11] fix tests and fix assignment pattern --- .../src/index.js | 16 +++++++++++++++- .../destructuring-array-pattern-1/input.js | 2 +- .../destructuring-array-pattern-1/output.js | 1 - .../destructuring-array-pattern-2/input.js | 2 +- .../destructuring-array-pattern-2/output.js | 1 - .../destructuring-array-pattern-3/exec.js | 14 ++++++++++++++ .../destructuring-array-pattern-3/input.js | 7 +++++++ .../destructuring-array-pattern-3/output.js | 12 ++++++++++++ .../destructuring-array-pattern/input.js | 2 +- .../destructuring-array-pattern/output.js | 1 - .../destructuring-object-pattern-1/input.js | 2 +- .../destructuring-object-pattern-1/output.js | 1 - .../destructuring-object-pattern-2/input.js | 2 +- .../destructuring-object-pattern-2/output.js | 1 - .../destructuring-object-pattern-3/exec.js | 14 ++++++++++++++ .../destructuring-object-pattern-3/input.js | 7 +++++++ .../destructuring-object-pattern-3/output.js | 14 ++++++++++++++ .../destructuring-object-pattern/input.js | 2 +- .../destructuring-object-pattern/output.js | 1 - .../destructuring-array-pattern-1/input.js | 2 +- .../destructuring-array-pattern-1/output.js | 1 - .../destructuring-array-pattern-2/input.js | 2 +- .../destructuring-array-pattern-2/output.js | 1 - .../destructuring-array-pattern-3/exec.js | 14 ++++++++++++++ .../destructuring-array-pattern-3/input.js | 7 +++++++ .../destructuring-array-pattern-3/output.js | 14 ++++++++++++++ .../private/destructuring-array-pattern/input.js | 2 +- .../destructuring-array-pattern/output.js | 1 - .../destructuring-object-pattern-1/input.js | 2 +- .../destructuring-object-pattern-1/output.js | 1 - .../destructuring-object-pattern-2/input.js | 2 +- .../destructuring-object-pattern-2/output.js | 1 - .../destructuring-object-pattern-3/exec.js | 14 ++++++++++++++ .../destructuring-object-pattern-3/input.js | 7 +++++++ .../destructuring-object-pattern-3/output.js | 16 ++++++++++++++++ .../destructuring-object-pattern/input.js | 2 +- .../destructuring-object-pattern/output.js | 1 - packages/babel-types/src/definitions/es2015.js | 8 +++++++- 38 files changed, 174 insertions(+), 26 deletions(-) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/output.js diff --git a/packages/babel-helper-member-expression-to-functions/src/index.js b/packages/babel-helper-member-expression-to-functions/src/index.js index 12fc683ed915..88b8514c2cdf 100644 --- a/packages/babel-helper-member-expression-to-functions/src/index.js +++ b/packages/babel-helper-member-expression-to-functions/src/index.js @@ -101,13 +101,27 @@ const handle = { } // { KEY: MEMBER } = OBJ -> { KEY: _destructureSet(MEMBER) } = OBJ + // { KEY: MEMBER = _VALUE } = OBJ -> { KEY: _destructureSet(MEMBER) = _VALUE } = OBJ + // {...MEMBER} -> {..._destructureSet(MEMBER)} + // // [MEMBER] = ARR -> [_destructureSet(MEMBER)] = ARR + // [MEMBER = _VALUE] = ARR -> [_destructureSet(MEMBER) = _VALUE] = ARR // [...MEMBER] -> [..._destructureSet(MEMBER)] - // {...MEMBER} -> {..._destructureSet(MEMBER)} if ( + // { KEY: MEMBER } = OBJ (parentPath.isObjectProperty({ value: node }) && parentPath.parentPath.isObjectPattern()) || + // { KEY: MEMBER = _VALUE } = OBJ + (parentPath.isAssignmentPattern({ left: node }) && + parentPath.parentPath.isObjectProperty({ value: parent }) && + parentPath.parentPath.parentPath.isObjectPattern()) || + // [MEMBER] = ARR parentPath.isArrayPattern() || + // [MEMBER = _VALUE] = ARR + (parentPath.isAssignmentPattern({ left: node }) && + parentPath.parentPath.isArrayPattern()) || + // {...MEMBER} + // [...MEMBER] parentPath.isRestElement() ) { member.replaceWith(this.destructureSet(member)); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js index 37fd45b2c58d..fa30cf5cf1e4 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js @@ -3,6 +3,6 @@ class Foo { constructor(props) { this.#client = 1; - ;([this.x = this.#client, this.#client, this.y = this.#client] = props); + ([this.x = this.#client, this.#client, this.y = this.#client] = props); } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js index 11b250ca1547..125c49f49cd1 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js @@ -7,7 +7,6 @@ var Foo = function Foo(props) { value: void 0 }); babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 1; - ; [this.x = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], this.y = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; }; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js index 01e9cb9d6178..e04fee2eb915 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js @@ -2,6 +2,6 @@ class Foo { #client constructor(props) { - ;([x, ...this.#client] = props); + ([x, ...this.#client] = props); } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js index c3bf863b5b4e..9b6c4ea89d62 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js @@ -6,7 +6,6 @@ var Foo = function Foo(props) { writable: true, value: void 0 }); - ; [x, ...babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; }; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/exec.js new file mode 100644 index 000000000000..1882aa63236d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ([this.#client = 5] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo([]); +expect(foo.getClient()).toEqual(5); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/input.js new file mode 100644 index 000000000000..1a5a134409e6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ([this.#client = 5] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/output.js new file mode 100644 index 000000000000..a784a6b0f3df --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/output.js @@ -0,0 +1,12 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + [babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 5] = props; +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js index ee428b3c1a66..264e1bc6ef27 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js @@ -2,6 +2,6 @@ class Foo { #client constructor(props) { - ;([this.#client] = props); + ([this.#client] = props); } } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js index 2511c128b05d..6d27b1b7faf0 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js @@ -6,7 +6,6 @@ var Foo = function Foo(props) { writable: true, value: void 0 }); - ; [babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; }; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js index 0917839f762f..bd3bbacb8cdc 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js @@ -3,6 +3,6 @@ class Foo { constructor(props) { this.#client = 'foo'; - ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + ({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js index 8bda80786821..c4738101c521 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js @@ -7,7 +7,6 @@ var Foo = function Foo(props) { value: void 0 }); babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 'foo'; - ; ({ x: this.x = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], y: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js index 12f011c72f93..9c020dcd126f 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js @@ -2,6 +2,6 @@ class Foo { #client constructor(props) { - ;({ x, ...this.#client } = props) + ({ x, ...this.#client } = props) } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js index 353eca713311..9786b38d6210 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js @@ -6,7 +6,6 @@ var Foo = function Foo(props) { writable: true, value: void 0 }); - ; ({ x, ...babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/exec.js new file mode 100644 index 000000000000..109ea2b6c62b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ({ client: this.#client = 5 } = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({}); +expect(foo.getClient()).toEqual(5); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/input.js new file mode 100644 index 000000000000..6f43a4ba0171 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ({ client: this.#client = 5 } = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/output.js new file mode 100644 index 000000000000..e4ed8b749f51 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/output.js @@ -0,0 +1,14 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + ({ + client: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 5 + } = props); +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js index 281626d43608..b46622eeb3e8 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js @@ -2,6 +2,6 @@ class Foo { #client constructor(props) { - ;({ client: this.#client } = props) + ({ client: this.#client } = props) } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js index 7a65e44ae0d3..989cacb99791 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js @@ -6,7 +6,6 @@ var Foo = function Foo(props) { writable: true, value: void 0 }); - ; ({ client: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] } = props); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js index 37fd45b2c58d..fa30cf5cf1e4 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js @@ -3,6 +3,6 @@ class Foo { constructor(props) { this.#client = 1; - ;([this.x = this.#client, this.#client, this.y = this.#client] = props); + ([this.x = this.#client, this.#client, this.y = this.#client] = props); } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js index a0843639f55a..50ee938ef1bb 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js @@ -9,7 +9,6 @@ var Foo = function Foo(props) { }); babelHelpers.classPrivateFieldSet(this, _client, 1); - ; [this.x = babelHelpers.classPrivateFieldGet(this, _client), babelHelpers.classPrivateFieldDestructureSet(this, _client).value, this.y = babelHelpers.classPrivateFieldGet(this, _client)] = props; }; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js index 01e9cb9d6178..e04fee2eb915 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js @@ -2,6 +2,6 @@ class Foo { #client constructor(props) { - ;([x, ...this.#client] = props); + ([x, ...this.#client] = props); } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js index 6b6ded747e55..6e66641ab3a7 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js @@ -8,7 +8,6 @@ var Foo = function Foo(props) { value: void 0 }); - ; [x, ...babelHelpers.classPrivateFieldDestructureSet(this, _client).value] = props; }; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/exec.js new file mode 100644 index 000000000000..1882aa63236d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ([this.#client = 5] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo([]); +expect(foo.getClient()).toEqual(5); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/input.js new file mode 100644 index 000000000000..1a5a134409e6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ([this.#client = 5] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/output.js new file mode 100644 index 000000000000..e7426334167a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/output.js @@ -0,0 +1,14 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + [babelHelpers.classPrivateFieldDestructureSet(this, _client).value = 5] = props; +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js index ee428b3c1a66..264e1bc6ef27 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js @@ -2,6 +2,6 @@ class Foo { #client constructor(props) { - ;([this.#client] = props); + ([this.#client] = props); } } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js index f156f89acc5a..8cfd77e1e36f 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js @@ -8,7 +8,6 @@ var Foo = function Foo(props) { value: void 0 }); - ; [babelHelpers.classPrivateFieldDestructureSet(this, _client).value] = props; }; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js index 0917839f762f..bd3bbacb8cdc 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js @@ -3,6 +3,6 @@ class Foo { constructor(props) { this.#client = 'foo'; - ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + ({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js index 5fe723f2fb25..a9623d18db3d 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js @@ -9,7 +9,6 @@ var Foo = function Foo(props) { }); babelHelpers.classPrivateFieldSet(this, _client, 'foo'); - ; ({ x: this.x = babelHelpers.classPrivateFieldGet(this, _client), y: babelHelpers.classPrivateFieldDestructureSet(this, _client).value, diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js index 12f011c72f93..9c020dcd126f 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js @@ -2,6 +2,6 @@ class Foo { #client constructor(props) { - ;({ x, ...this.#client } = props) + ({ x, ...this.#client } = props) } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js index f903c8058189..22b58fd39617 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js @@ -8,7 +8,6 @@ var Foo = function Foo(props) { value: void 0 }); - ; ({ x, ...babelHelpers.classPrivateFieldDestructureSet(this, _client).value diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/exec.js new file mode 100644 index 000000000000..60fab21660a3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ({x: this.#client = 5} = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({}); +expect(foo.getClient()).toEqual(5); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/input.js new file mode 100644 index 000000000000..47a6958c0145 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ({x: this.#client = 5} = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/output.js new file mode 100644 index 000000000000..3509915f38a5 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/output.js @@ -0,0 +1,16 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ({ + x: babelHelpers.classPrivateFieldDestructureSet(this, _client).value = 5 + } = props); +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js index 281626d43608..b46622eeb3e8 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js @@ -2,6 +2,6 @@ class Foo { #client constructor(props) { - ;({ client: this.#client } = props) + ({ client: this.#client } = props) } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js index 4ef881446880..e49b06dd952c 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js @@ -8,7 +8,6 @@ var Foo = function Foo(props) { value: void 0 }); - ; ({ client: babelHelpers.classPrivateFieldDestructureSet(this, _client).value } = props); diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js index e18d0e49763c..8d99dc084c02 100644 --- a/packages/babel-types/src/definitions/es2015.js +++ b/packages/babel-types/src/definitions/es2015.js @@ -19,7 +19,13 @@ defineType("AssignmentPattern", { fields: { ...patternLikeCommon, left: { - validate: assertNodeType("Identifier", "ObjectPattern", "ArrayPattern"), + validate: assertNodeType( + "Identifier", + "ObjectPattern", + "ArrayPattern", + "MemberExpression", + "CallExpression", + ), }, right: { validate: assertNodeType("Expression"), From b9538c313d77632f7b80281f2778678c5a255096 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sun, 14 Jul 2019 14:01:52 +0800 Subject: [PATCH 11/11] remove CallExpression from AssignmentPattern --- packages/babel-types/src/definitions/es2015.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js index 8d99dc084c02..55eb1cde2863 100644 --- a/packages/babel-types/src/definitions/es2015.js +++ b/packages/babel-types/src/definitions/es2015.js @@ -24,7 +24,6 @@ defineType("AssignmentPattern", { "ObjectPattern", "ArrayPattern", "MemberExpression", - "CallExpression", ), }, right: {