Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve output when privateFieldsAsProperties or privateFieldsAsSymbols #16313

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
53 changes: 49 additions & 4 deletions packages/babel-helper-create-class-features-plugin/src/fields.ts
Expand Up @@ -624,7 +624,7 @@ const privateNameHandlerSpec: Handler<PrivateNameState & Receiver> & Receiver =
t.cloneNode(classRef),
receiver,
]),
readOnlyError(file, name),
err,
]);
}

Expand Down Expand Up @@ -839,6 +839,13 @@ const privateNameHandlerLoose: Handler<PrivateNameState> = {
const { object } = member.node;
const { name } = (member.node.property as t.PrivateName).id;

if (process.env.BABEL_8_BREAKING || newHelpers(file)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

newHelpers doesn't work here anymore, because it returns true in 7.24.0

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah. I have modified newHelpers to return true in v7.24.1. Maybe the changes were lost for some reason.
What do you think of this approach?

return template.expression`BASE(REF, PROP, 1)`({
BASE: file.addHelper("assertClassBrandLoose"),
REF: t.cloneNode(object),
PROP: t.cloneNode(privateNamesMap.get(name).id),
});
}
return template.expression`BASE(REF, PROP)[PROP]`({
BASE: file.addHelper("classPrivateFieldLooseBase"),
REF: t.cloneNode(object),
Expand All @@ -860,19 +867,57 @@ const privateNameHandlerLoose: Handler<PrivateNameState> = {
},

simpleSet(member) {
const { privateNamesMap, file } = this;
const { object } = member.node;
const { name } = (member.node.property as t.PrivateName).id;

if (process.env.BABEL_8_BREAKING || newHelpers(file)) {
return template.expression`BASE(REF, PROP)[PROP]`({
BASE: file.addHelper("assertClassBrandLoose"),
REF: t.cloneNode(object),
PROP: t.cloneNode(privateNamesMap.get(name).id),
});
}
return this.get(member);
},

destructureSet(member) {
return this.get(member);
return this.simpleSet(member);
},

call(member, args) {
return t.callExpression(this.get(member), args);
const { privateNamesMap } = this;
const { node } = member;

return t.callExpression(
t.memberExpression(
t.cloneNode(node.object),
t.cloneNode(
privateNamesMap.get((member.node.property as t.PrivateName).id.name)
.id,
),
true,
),
args,
);
},

optionalCall(member, args) {
return t.optionalCallExpression(this.get(member), args, true);
const { privateNamesMap } = this;
const { node } = member;

return t.optionalCallExpression(
t.memberExpression(
t.cloneNode(node.object),
t.cloneNode(
privateNamesMap.get((member.node.property as t.PrivateName).id.name)
.id,
),
true,
),
args,
true,
);
},

delete() {
Expand Down
5 changes: 5 additions & 0 deletions packages/babel-helpers/src/helpers-generated.ts
Expand Up @@ -58,6 +58,11 @@ export default Object.freeze({
"7.24.0",
'export default function _assertClassBrand(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}',
),
// size: 168, gzip size: 159
assertClassBrandLoose: helper(
"7.24.1",
'export default function _assertClassBrandLoose(e,t,r){if(!{}.hasOwnProperty.call(e,t))throw TypeError("attempted to use private field on non-instance");return r?e[t]:e}',
),
// size: 544, gzip size: 300
asyncGeneratorDelegate: helper(
"7.0.0-beta.0",
Expand Down
12 changes: 12 additions & 0 deletions packages/babel-helpers/src/helpers/assertClassBrandLoose.ts
@@ -0,0 +1,12 @@
/* @minVersion 7.24.1 */

export default function _assertClassBrandLoose(
receiver: any,
privateKey: string | symbol,
returnProperty: boolean,
) {
if (!{}.hasOwnProperty.call(receiver, privateKey)) {
throw TypeError("attempted to use private field on non-instance");
}
return returnProperty ? receiver[privateKey] : receiver;
}
Expand Up @@ -8,11 +8,11 @@ class A {
}
method() {
var _obj, _obj2, _obj3, _obj4, _obj5, _obj6;
(_obj = obj) === null || _obj === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(_obj, _x)[_x] = 1;
(_obj2 = obj) === null || _obj2 === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(_obj2, _x)[_x] += 2;
(_obj3 = obj) === null || _obj3 === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(_obj3, _x)[_x] ??= 3;
(_obj4 = obj) === null || _obj4 === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(_obj4, _x)[_x].y = 4;
(_obj5 = obj) === null || _obj5 === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(_obj5, _x)[_x].y += 5;
(_obj6 = obj) === null || _obj6 === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(_obj6, _x)[_x].y ??= 6;
(_obj = obj) === null || _obj === void 0 ? void 0 : babelHelpers.assertClassBrandLoose(_obj, _x)[_x] = 1;
(_obj2 = obj) === null || _obj2 === void 0 ? void 0 : babelHelpers.assertClassBrandLoose(_obj2, _x)[_x] += 2;
(_obj3 = obj) === null || _obj3 === void 0 ? void 0 : babelHelpers.assertClassBrandLoose(_obj3, _x)[_x] ??= 3;
(_obj4 = obj) === null || _obj4 === void 0 ? void 0 : babelHelpers.assertClassBrandLoose(_obj4, _x, 1).y = 4;
(_obj5 = obj) === null || _obj5 === void 0 ? void 0 : babelHelpers.assertClassBrandLoose(_obj5, _x, 1).y += 5;
(_obj6 = obj) === null || _obj6 === void 0 ? void 0 : babelHelpers.assertClassBrandLoose(_obj6, _x, 1).y ??= 6;
}
}
Expand Up @@ -12,10 +12,10 @@ var Foo = /*#__PURE__*/function () {
return babelHelpers.createClass(Foo, [{
key: "test",
value: function test(other) {
babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo] += 1;
babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo] = 2;
babelHelpers.classPrivateFieldLooseBase(other.obj, _foo)[_foo] += 1;
babelHelpers.classPrivateFieldLooseBase(other.obj, _foo)[_foo] = 2;
babelHelpers.assertClassBrandLoose(this, _foo)[_foo] += 1;
babelHelpers.assertClassBrandLoose(this, _foo)[_foo] = 2;
babelHelpers.assertClassBrandLoose(other.obj, _foo)[_foo] += 1;
babelHelpers.assertClassBrandLoose(other.obj, _foo)[_foo] = 2;
}
}]);
}();
Expand Up @@ -14,8 +14,8 @@ var Foo = /*#__PURE__*/function () {
return babelHelpers.createClass(Foo, [{
key: "test",
value: function test(other) {
babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]();
babelHelpers.classPrivateFieldLooseBase(other.obj, _foo)[_foo]();
this[_foo]();
other.obj[_foo]();
}
}]);
}();
Expand Up @@ -13,34 +13,34 @@ var Point = /*#__PURE__*/function () {
writable: true,
value: void 0
});
babelHelpers.classPrivateFieldLooseBase(this, _x)[_x] = +x;
babelHelpers.classPrivateFieldLooseBase(this, _y)[_y] = +y;
babelHelpers.assertClassBrandLoose(this, _x)[_x] = +x;
babelHelpers.assertClassBrandLoose(this, _y)[_y] = +y;
}
return babelHelpers.createClass(Point, [{
key: "x",
get: function () {
return babelHelpers.classPrivateFieldLooseBase(this, _x)[_x];
return babelHelpers.assertClassBrandLoose(this, _x, 1);
},
set: function (value) {
babelHelpers.classPrivateFieldLooseBase(this, _x)[_x] = +value;
babelHelpers.assertClassBrandLoose(this, _x)[_x] = +value;
}
}, {
key: "y",
get: function () {
return babelHelpers.classPrivateFieldLooseBase(this, _y)[_y];
return babelHelpers.assertClassBrandLoose(this, _y, 1);
},
set: function (value) {
babelHelpers.classPrivateFieldLooseBase(this, _y)[_y] = +value;
babelHelpers.assertClassBrandLoose(this, _y)[_y] = +value;
}
}, {
key: "equals",
value: function equals(p) {
return babelHelpers.classPrivateFieldLooseBase(this, _x)[_x] === babelHelpers.classPrivateFieldLooseBase(p, _x)[_x] && babelHelpers.classPrivateFieldLooseBase(this, _y)[_y] === babelHelpers.classPrivateFieldLooseBase(p, _y)[_y];
return babelHelpers.assertClassBrandLoose(this, _x, 1) === babelHelpers.assertClassBrandLoose(p, _x, 1) && babelHelpers.assertClassBrandLoose(this, _y, 1) === babelHelpers.assertClassBrandLoose(p, _y, 1);
}
}, {
key: "toString",
value: function toString() {
return `Point<${babelHelpers.classPrivateFieldLooseBase(this, _x)[_x]},${babelHelpers.classPrivateFieldLooseBase(this, _y)[_y]}>`;
return `Point<${babelHelpers.assertClassBrandLoose(this, _x, 1)},${babelHelpers.assertClassBrandLoose(this, _y, 1)}>`;
}
}]);
}();
Expand Up @@ -3,7 +3,7 @@ var C = /*#__PURE__*/babelHelpers.createClass(function C() {
"use strict";

babelHelpers.classCallCheck(this, C);
this.y = babelHelpers.classPrivateFieldLooseBase(this, _x)[_x];
this.y = babelHelpers.assertClassBrandLoose(this, _x, 1);
Object.defineProperty(this, _x, {
writable: true,
value: void 0
Expand Down
Expand Up @@ -7,6 +7,6 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
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;
babelHelpers.assertClassBrandLoose(this, _client)[_client] = 1;
[this.x = babelHelpers.assertClassBrandLoose(this, _client, 1), babelHelpers.assertClassBrandLoose(this, _client)[_client], this.y = babelHelpers.assertClassBrandLoose(this, _client, 1)] = props;
});
Expand Up @@ -7,5 +7,5 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
writable: true,
value: void 0
});
[x, ...babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props;
[x, ...babelHelpers.assertClassBrandLoose(this, _client)[_client]] = props;
});
Expand Up @@ -7,5 +7,5 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
writable: true,
value: void 0
});
[babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 5] = props;
[babelHelpers.assertClassBrandLoose(this, _client)[_client] = 5] = props;
});
Expand Up @@ -3,7 +3,7 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
"use strict";

babelHelpers.classCallCheck(this, Foo);
[babelHelpers.classPrivateFieldLooseBase(Foo, _client)[_client]] = props;
[babelHelpers.assertClassBrandLoose(Foo, _client)[_client]] = props;
});
Object.defineProperty(Foo, _client, {
writable: true,
Expand Down
Expand Up @@ -7,5 +7,5 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
writable: true,
value: void 0
});
[babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props;
[babelHelpers.assertClassBrandLoose(this, _client)[_client]] = props;
});
Expand Up @@ -7,10 +7,10 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
writable: true,
value: void 0
});
babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 'foo';
babelHelpers.assertClassBrandLoose(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]
x: this.x = babelHelpers.assertClassBrandLoose(this, _client, 1),
y: babelHelpers.assertClassBrandLoose(this, _client)[_client],
z: this.z = babelHelpers.assertClassBrandLoose(this, _client, 1)
} = props);
});
Expand Up @@ -9,6 +9,6 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
});
({
x,
...babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]
...babelHelpers.assertClassBrandLoose(this, _client)[_client]
} = props);
});
Expand Up @@ -8,6 +8,6 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
value: void 0
});
({
client: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 5
client: babelHelpers.assertClassBrandLoose(this, _client)[_client] = 5
} = props);
});
Expand Up @@ -4,7 +4,7 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {

babelHelpers.classCallCheck(this, Foo);
({
client: babelHelpers.classPrivateFieldLooseBase(Foo, _client)[_client]
client: babelHelpers.assertClassBrandLoose(Foo, _client)[_client]
} = props);
});
Object.defineProperty(Foo, _client, {
Expand Down
Expand Up @@ -8,6 +8,6 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo(props) {
value: void 0
});
({
client: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]
client: babelHelpers.assertClassBrandLoose(this, _client)[_client]
} = props);
});
Expand Up @@ -20,10 +20,10 @@ class Foo {
return this;
}
test() {
var _babelHelpers$classPr, _babelHelpers$classPr2, _babelHelpers$classPr3, _babelHelpers$classPr4;
(_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _nullish))[_nullish] ?? (_babelHelpers$classPr[_nullish] = 42);
(_babelHelpers$classPr2 = babelHelpers.classPrivateFieldLooseBase(this, _and))[_and] && (_babelHelpers$classPr2[_and] = 0);
(_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(this, _or))[_or] || (_babelHelpers$classPr3[_or] = 0);
(_babelHelpers$classPr4 = babelHelpers.classPrivateFieldLooseBase(this.self(), _nullish))[_nullish] ?? (_babelHelpers$classPr4[_nullish] = 42);
var _babelHelpers$assertC, _babelHelpers$assertC2, _babelHelpers$assertC3, _babelHelpers$assertC4;
(_babelHelpers$assertC = babelHelpers.assertClassBrandLoose(this, _nullish))[_nullish] ?? (_babelHelpers$assertC[_nullish] = 42);
(_babelHelpers$assertC2 = babelHelpers.assertClassBrandLoose(this, _and))[_and] && (_babelHelpers$assertC2[_and] = 0);
(_babelHelpers$assertC3 = babelHelpers.assertClassBrandLoose(this, _or))[_or] || (_babelHelpers$assertC3[_or] = 0);
(_babelHelpers$assertC4 = babelHelpers.assertClassBrandLoose(this.self(), _nullish))[_nullish] ?? (_babelHelpers$assertC4[_nullish] = 42);
}
}
Expand Up @@ -10,6 +10,6 @@ var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo() {
});
Object.defineProperty(this, _y, {
writable: true,
value: babelHelpers.classPrivateFieldLooseBase(this, _x)[_x]
value: babelHelpers.assertClassBrandLoose(this, _x, 1)
});
});
Expand Up @@ -8,10 +8,10 @@ class Foo {
});
}
static test() {
return babelHelpers.classPrivateFieldLooseBase(Foo, _foo)[_foo];
return babelHelpers.assertClassBrandLoose(Foo, _foo, 1);
}
test() {
return babelHelpers.classPrivateFieldLooseBase(this, _bar)[_bar];
return babelHelpers.assertClassBrandLoose(this, _bar, 1);
}
}
Object.defineProperty(Foo, _foo, {
Expand Down
Expand Up @@ -12,9 +12,9 @@ var Foo = /*#__PURE__*/function () {
return babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
var _babelHelpers$classPr;
var _babelHelpers$assertC;
var _foo2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo");
_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _foo2)[_foo2];
_babelHelpers$assertC = babelHelpers.assertClassBrandLoose(this, _foo2, 1);
var Nested = /*#__PURE__*/function () {
function Nested() {
babelHelpers.classCallCheck(this, Nested);
Expand All @@ -24,11 +24,11 @@ var Foo = /*#__PURE__*/function () {
});
}
return babelHelpers.createClass(Nested, [{
key: _babelHelpers$classPr,
key: _babelHelpers$assertC,
value: function () {}
}]);
}();
babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo];
babelHelpers.assertClassBrandLoose(this, _foo, 1);
}
}]);
}();
Expand Up @@ -12,16 +12,16 @@ var Foo = /*#__PURE__*/function () {
return babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
var Nested = /*#__PURE__*/function (_babelHelpers$classPr) {
var Nested = /*#__PURE__*/function (_babelHelpers$assertC) {
function Nested() {
babelHelpers.classCallCheck(this, Nested);
}
return babelHelpers.createClass(Nested, [{
key: _babelHelpers$classPr,
key: _babelHelpers$assertC,
value: function () {}
}]);
}(babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo]);
babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo];
}(babelHelpers.assertClassBrandLoose(this, _foo, 1));
babelHelpers.assertClassBrandLoose(this, _foo, 1);
}
}]);
}();