From 9b48a8ead739b1cb786ab03a8148b7d96c17b295 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Tue, 14 Apr 2020 15:51:51 -0400 Subject: [PATCH] Fix nested classes reference private fields (#11405) * Fix nested classes reference private fields * Process only visible private fields when redeclaring * Comments * Skip class traversal if there are no private fields * Handle redeclared private field in computed key --- .../src/fields.js | 50 ++++++++++++++---- .../nested-class-computed-redeclared/input.js | 14 +++++ .../output.js | 43 +++++++++++++++ .../nested-class-computed/input.js | 12 +++++ .../nested-class-computed/output.js | 35 +++++++++++++ .../nested-class-other-redeclared/input.js | 18 +++++++ .../nested-class-other-redeclared/output.js | 49 +++++++++++++++++ .../nested-class-redeclared/input.js | 15 ++++++ .../nested-class-redeclared/output.js | 41 +++++++++++++++ .../private-loose/nested-class/input.js | 13 +++++ .../private-loose/nested-class/output.js | 35 +++++++++++++ .../nested-class-computed-redeclared/input.js | 14 +++++ .../output.js | 45 ++++++++++++++++ .../private/nested-class-computed/input.js | 12 +++++ .../private/nested-class-computed/output.js | 36 +++++++++++++ .../nested-class-other-redeclared/input.js | 18 +++++++ .../nested-class-other-redeclared/output.js | 52 +++++++++++++++++++ .../private/nested-class-redeclared/input.js | 15 ++++++ .../private/nested-class-redeclared/output.js | 43 +++++++++++++++ .../fixtures/private/nested-class/input.js | 13 +++++ .../fixtures/private/nested-class/output.js | 36 +++++++++++++ 21 files changed, 598 insertions(+), 11 deletions(-) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed-redeclared/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed-redeclared/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-other-redeclared/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-other-redeclared/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-redeclared/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-redeclared/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed-redeclared/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed-redeclared/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-other-redeclared/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-other-redeclared/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-redeclared/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-redeclared/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class/output.js diff --git a/packages/babel-helper-create-class-features-plugin/src/fields.js b/packages/babel-helper-create-class-features-plugin/src/fields.js index 167e894cae..083d35056b 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -85,24 +85,50 @@ const privateNameVisitor = { const { privateNamesMap } = this; const body = path.get("body.body"); + const visiblePrivateNames = new Map(privateNamesMap); + const redeclared = []; for (const prop of body) { - if (!prop.isPrivate()) { - continue; - } - if (!privateNamesMap.has(prop.node.key.id.name)) continue; - - // This class redeclares the private name. - // So, we can only evaluate the things in the outer scope. - path.traverse(privateNameInnerVisitor, this); - path.skip(); - break; + if (!prop.isPrivate()) continue; + const { name } = prop.node.key.id; + visiblePrivateNames.delete(name); + redeclared.push(name); } + + // If the class doesn't redeclare any private fields, we can continue with + // our overall traversal. + if (!redeclared.length) { + return; + } + + // This class redeclares some private field. We need to process the outer + // environment with access to all the outer privates, then we can process + // the inner environment with only the still-visible outer privates. + path.get("superClass").traverse(privateNameVisitor, this); + path.get("body").traverse(privateNameNestedVisitor, { + ...this, + redeclared, + }); + path.traverse(privateNameVisitor, { + ...this, + privateNamesMap: visiblePrivateNames, + }); + + // We'll eventually hit this class node again with the overall Class + // Features visitor, which'll process the redeclared privates. + path.skip(); }, }; // Traverses the outer portion of a class, without touching the class's inner // scope, for private names. -const privateNameInnerVisitor = traverse.visitors.merge([ +const privateNameNestedVisitor = traverse.visitors.merge([ + { + PrivateName(path) { + const { redeclared } = this; + const { name } = path.node.id; + if (redeclared.includes(name)) path.skip(); + }, + }, { PrivateName: privateNameVisitor.PrivateName, }, @@ -263,6 +289,8 @@ export function transformPrivateNamesUsage( loose, state, ) { + if (!privateNamesMap.size) return; + const body = path.get("body"); if (loose) { diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed-redeclared/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed-redeclared/input.js new file mode 100644 index 0000000000..1a8d9de8e7 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed-redeclared/input.js @@ -0,0 +1,14 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + [this.#foo]() { + } + } + + this.#foo; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed-redeclared/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed-redeclared/output.js new file mode 100644 index 0000000000..f664abf329 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed-redeclared/output.js @@ -0,0 +1,43 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var _babelHelpers$classPr; + + _babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _foo2)[_foo2]; + + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + Object.defineProperty(this, _foo2, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: _babelHelpers$classPr, + value: function () {} + }]); + return Nested; + }(); + + var _foo2 = babelHelpers.classPrivateFieldLooseKey("foo"); + + babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]; + } + }]); + return Foo; +}(); + +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed/input.js new file mode 100644 index 0000000000..7786425d1c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed/input.js @@ -0,0 +1,12 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + [this.#foo]() { + } + } + + this.#foo; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed/output.js new file mode 100644 index 0000000000..57c5ed3249 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-computed/output.js @@ -0,0 +1,35 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var _this = this; + + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + } + + babelHelpers.createClass(Nested, [{ + key: babelHelpers.classPrivateFieldLooseBase(_this, _foo)[_foo], + value: function () {} + }]); + return Nested; + }(); + + babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]; + } + }]); + return Foo; +}(); + +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-other-redeclared/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-other-redeclared/input.js new file mode 100644 index 0000000000..4e0f3dd8a2 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-other-redeclared/input.js @@ -0,0 +1,18 @@ +class Foo { + #foo = 1; + #bar = 1; + + test() { + class Nested { + #bar = 2; + + test() { + this.#foo; + this.#bar; + } + } + + this.#foo; + this.#bar; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-other-redeclared/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-other-redeclared/output.js new file mode 100644 index 0000000000..f906d5562d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-other-redeclared/output.js @@ -0,0 +1,49 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + Object.defineProperty(this, _bar, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + Object.defineProperty(this, _bar2, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]; + babelHelpers.classPrivateFieldLooseBase(this, _bar2)[_bar2]; + } + }]); + return Nested; + }(); + + var _bar2 = babelHelpers.classPrivateFieldLooseKey("bar"); + + babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]; + babelHelpers.classPrivateFieldLooseBase(this, _bar)[_bar]; + } + }]); + return Foo; +}(); + +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +var _bar = babelHelpers.classPrivateFieldLooseKey("bar"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-redeclared/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-redeclared/input.js new file mode 100644 index 0000000000..c4d2eaa637 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-redeclared/input.js @@ -0,0 +1,15 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + test() { + this.#foo; + } + } + + this.#foo; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-redeclared/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-redeclared/output.js new file mode 100644 index 0000000000..055ff8b465 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class-redeclared/output.js @@ -0,0 +1,41 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + Object.defineProperty(this, _foo2, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + babelHelpers.classPrivateFieldLooseBase(this, _foo2)[_foo2]; + } + }]); + return Nested; + }(); + + var _foo2 = babelHelpers.classPrivateFieldLooseKey("foo"); + + babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]; + } + }]); + return Foo; +}(); + +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class/input.js new file mode 100644 index 0000000000..a0b794493e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class/input.js @@ -0,0 +1,13 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + test() { + this.#foo; + } + } + + this.#foo; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class/output.js new file mode 100644 index 0000000000..b12260adcf --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/nested-class/output.js @@ -0,0 +1,35 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]; + } + }]); + return Nested; + }(); + + babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]; + } + }]); + return Foo; +}(); + +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed-redeclared/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed-redeclared/input.js new file mode 100644 index 0000000000..1a8d9de8e7 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed-redeclared/input.js @@ -0,0 +1,14 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + [this.#foo]() { + } + } + + this.#foo; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed-redeclared/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed-redeclared/output.js new file mode 100644 index 0000000000..c7895115ed --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed-redeclared/output.js @@ -0,0 +1,45 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var _babelHelpers$classPr; + + _babelHelpers$classPr = babelHelpers.classPrivateFieldGet(this, _foo2); + + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + + _foo2.set(this, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: _babelHelpers$classPr, + value: function () {} + }]); + return Nested; + }(); + + var _foo2 = new WeakMap(); + + babelHelpers.classPrivateFieldGet(this, _foo); + } + }]); + return Foo; +}(); + +var _foo = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed/input.js new file mode 100644 index 0000000000..7786425d1c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed/input.js @@ -0,0 +1,12 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + [this.#foo]() { + } + } + + this.#foo; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed/output.js new file mode 100644 index 0000000000..4d06d83506 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-computed/output.js @@ -0,0 +1,36 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var _this = this; + + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + } + + babelHelpers.createClass(Nested, [{ + key: babelHelpers.classPrivateFieldGet(_this, _foo), + value: function () {} + }]); + return Nested; + }(); + + babelHelpers.classPrivateFieldGet(this, _foo); + } + }]); + return Foo; +}(); + +var _foo = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-other-redeclared/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-other-redeclared/input.js new file mode 100644 index 0000000000..4e0f3dd8a2 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-other-redeclared/input.js @@ -0,0 +1,18 @@ +class Foo { + #foo = 1; + #bar = 1; + + test() { + class Nested { + #bar = 2; + + test() { + this.#foo; + this.#bar; + } + } + + this.#foo; + this.#bar; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-other-redeclared/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-other-redeclared/output.js new file mode 100644 index 0000000000..6d65fc2296 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-other-redeclared/output.js @@ -0,0 +1,52 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + + _bar.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + + _bar2.set(this, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + babelHelpers.classPrivateFieldGet(this, _foo); + babelHelpers.classPrivateFieldGet(this, _bar2); + } + }]); + return Nested; + }(); + + var _bar2 = new WeakMap(); + + babelHelpers.classPrivateFieldGet(this, _foo); + babelHelpers.classPrivateFieldGet(this, _bar); + } + }]); + return Foo; +}(); + +var _foo = new WeakMap(); + +var _bar = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-redeclared/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-redeclared/input.js new file mode 100644 index 0000000000..c4d2eaa637 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-redeclared/input.js @@ -0,0 +1,15 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + test() { + this.#foo; + } + } + + this.#foo; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-redeclared/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-redeclared/output.js new file mode 100644 index 0000000000..3f61e52035 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class-redeclared/output.js @@ -0,0 +1,43 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + + _foo2.set(this, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + babelHelpers.classPrivateFieldGet(this, _foo2); + } + }]); + return Nested; + }(); + + var _foo2 = new WeakMap(); + + babelHelpers.classPrivateFieldGet(this, _foo); + } + }]); + return Foo; +}(); + +var _foo = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class/input.js new file mode 100644 index 0000000000..a0b794493e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class/input.js @@ -0,0 +1,13 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + test() { + this.#foo; + } + } + + this.#foo; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class/output.js new file mode 100644 index 0000000000..e4d225a498 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/nested-class/output.js @@ -0,0 +1,36 @@ +var Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + babelHelpers.classPrivateFieldGet(this, _foo); + } + }]); + return Nested; + }(); + + babelHelpers.classPrivateFieldGet(this, _foo); + } + }]); + return Foo; +}(); + +var _foo = new WeakMap();