Skip to content

Commit 668245b

Browse files
Merge pull request #56 from bloomberg/es-private-methods-and-accessors-simplify-emit
Es private methods and accessors simplify emit
2 parents 7490a36 + a3fdc4b commit 668245b

File tree

72 files changed

+989
-1414
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+989
-1414
lines changed

src/compiler/factory/emitHelpers.ts

+128-261
Large diffs are not rendered by default.

src/compiler/transformers/classFields.ts

+161-235
Large diffs are not rendered by default.

tests/baselines/reference/importHelpersES6.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ let A = class A {
2727
_A_x.set(this, 1);
2828
}
2929
f() {
30-
return __awaiter(this, void 0, void 0, function* () { __classPrivateFieldSet(this, _A_x, yield __classPrivateFieldGet(this, _A_x)); });
30+
return __awaiter(this, void 0, void 0, function* () { __classPrivateFieldSet(this, _A_x, yield __classPrivateFieldGet(this, _A_x, "f"), "f"); });
3131
}
3232
};
3333
_A_x = new WeakMap();

tests/baselines/reference/privateNameAccessors.js

+13-18
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,25 @@ class A1 {
1616

1717
//// [privateNameAccessors.js]
1818
"use strict";
19-
var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) {
20-
if (!instances.has(receiver)) {
21-
throw new TypeError("attempted to set private accessor on non-instance");
22-
}
23-
fn.call(receiver, value);
24-
return value;
25-
};
26-
var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () {
27-
throw new TypeError("private element is not writable");
19+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
20+
if (kind === "m") throw new TypeError("Private method is not writable");
21+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
22+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
23+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
2824
};
29-
var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) {
30-
if (!instances.has(receiver)) {
31-
throw new TypeError("attempted to get private accessor on non-instance");
32-
}
33-
return fn.call(receiver);
25+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
26+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
27+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
28+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
3429
};
3530
var _A1_instances, _A1_prop_get, _A1_prop_set, _A1_roProp_get;
3631
class A1 {
3732
constructor(name) {
3833
_A1_instances.add(this);
39-
__classPrivateAccessorSet(this, _A1_instances, _A1_prop_set, "");
40-
__classPrivateReadonly(this, ""); // Error
41-
console.log(__classPrivateAccessorGet(this, _A1_instances, _A1_prop_get));
42-
console.log(__classPrivateAccessorGet(this, _A1_instances, _A1_roProp_get));
34+
__classPrivateFieldSet(this, _A1_instances, "", "a", _A1_prop_set);
35+
__classPrivateFieldSet(this, _A1_instances, "", "a"); // Error
36+
console.log(__classPrivateFieldGet(this, _A1_instances, "a", _A1_prop_get));
37+
console.log(__classPrivateFieldGet(this, _A1_instances, "a", _A1_roProp_get));
4338
}
4439
}
4540
_A1_instances = new WeakSet(), _A1_prop_get = function _A1_prop_get() { return ""; }, _A1_prop_set = function _A1_prop_set(param) { }, _A1_roProp_get = function _A1_roProp_get() { return ""; };

tests/baselines/reference/privateNameAccessorsAccess.js

+7-8
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,20 @@ class B2 {
2626

2727

2828
//// [privateNameAccessorsAccess.js]
29-
var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) {
30-
if (!instances.has(receiver)) {
31-
throw new TypeError("attempted to get private accessor on non-instance");
32-
}
33-
return fn.call(receiver);
29+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
30+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
31+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
32+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
3433
};
3534
var _A2_instances, _A2_prop_get, _A2_prop_set;
3635
class A2 {
3736
constructor() {
3837
_A2_instances.add(this);
39-
console.log(__classPrivateAccessorGet(this, _A2_instances, _A2_prop_get));
38+
console.log(__classPrivateFieldGet(this, _A2_instances, "a", _A2_prop_get));
4039
let a = this;
41-
__classPrivateAccessorGet(a, _A2_instances, _A2_prop_get);
40+
__classPrivateFieldGet(a, _A2_instances, "a", _A2_prop_get);
4241
function foo() {
43-
__classPrivateAccessorGet(a, _A2_instances, _A2_prop_get);
42+
__classPrivateFieldGet(a, _A2_instances, "a", _A2_prop_get);
4443
}
4544
}
4645
}

tests/baselines/reference/privateNameAccessorsCallExpression.js

+11-12
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ class A {
1919
}
2020

2121
//// [privateNameAccessorsCallExpression.js]
22-
var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) {
23-
if (!instances.has(receiver)) {
24-
throw new TypeError("attempted to get private accessor on non-instance");
25-
}
26-
return fn.call(receiver);
22+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
23+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
24+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
25+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
2726
};
2827
var _A_instances, _A_fieldFunc_get, _A_fieldFunc2_get;
2928
class A {
@@ -33,15 +32,15 @@ class A {
3332
}
3433
test() {
3534
var _a;
36-
__classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get).call(this);
37-
const func = __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get);
35+
__classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc_get).call(this);
36+
const func = __classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc_get);
3837
func();
39-
new (__classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get))();
38+
new (__classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc_get))();
4039
const arr = [1, 2];
41-
__classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get).call(this, 0, ...arr, 3);
42-
const b = new (__classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get))(0, ...arr, 3);
43-
const str = __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`;
44-
__classPrivateAccessorGet((_a = this.getInstance()), _A_instances, _A_fieldFunc2_get).bind(_a) `test${1}and${2}`;
40+
__classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc2_get).call(this, 0, ...arr, 3);
41+
const b = new (__classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc2_get))(0, ...arr, 3);
42+
const str = __classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`;
43+
__classPrivateFieldGet((_a = this.getInstance()), _A_instances, "a", _A_fieldFunc2_get).bind(_a) `test${1}and${2}`;
4544
}
4645
getInstance() { return new A(); }
4746
}

tests/baselines/reference/privateNameAccessorssDerivedClasses.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,18 @@ class Derived extends Base {
1313

1414

1515
//// [privateNameAccessorssDerivedClasses.js]
16-
var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) {
17-
if (!instances.has(receiver)) {
18-
throw new TypeError("attempted to get private accessor on non-instance");
19-
}
20-
return fn.call(receiver);
16+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
17+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
18+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
19+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
2120
};
2221
var _Base_instances, _Base_prop_get;
2322
class Base {
2423
constructor() {
2524
_Base_instances.add(this);
2625
}
2726
static method(x) {
28-
console.log(__classPrivateAccessorGet(x, _Base_instances, _Base_prop_get));
27+
console.log(__classPrivateFieldGet(x, _Base_instances, "a", _Base_prop_get));
2928
}
3029
}
3130
_Base_instances = new WeakSet(), _Base_prop_get = function _Base_prop_get() { return 123; };

tests/baselines/reference/privateNameAndAny.js

+16-32
Original file line numberDiff line numberDiff line change
@@ -29,54 +29,38 @@ class A {
2929

3030
//// [privateNameAndAny.js]
3131
"use strict";
32-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
33-
if (!privateMap.has(receiver)) {
34-
throw new TypeError("attempted to get private field on non-instance");
35-
}
36-
return privateMap.get(receiver);
37-
};
38-
var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) {
39-
if (receiver !== classConstructor) {
40-
throw new TypeError("Private static access of wrong provenance");
41-
}
42-
return fn;
43-
};
44-
var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) {
45-
if (receiver !== classConstructor) {
46-
throw new TypeError("Private static access of wrong provenance");
47-
}
48-
if (propertyDescriptor === undefined) {
49-
throw new TypeError("Private static field was accessed before its declaration.");
50-
}
51-
return propertyDescriptor.value;
32+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
33+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
34+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
35+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5236
};
5337
var _a, _A_foo, _A_baz, _A_m;
5438
class A {
5539
constructor() {
5640
_A_foo.set(this, true);
5741
}
5842
method(thing) {
59-
__classPrivateFieldGet(thing, _A_foo); // OK
60-
__classStaticPrivateMethodGet(thing, _a, _A_m).call(// OK
43+
__classPrivateFieldGet(thing, _A_foo, "f"); // OK
44+
__classPrivateFieldGet(thing, _a, "m", _A_m).call(// OK
6145
thing);
62-
__classStaticPrivateFieldGet(thing, _a, _A_baz);
46+
__classPrivateFieldGet(thing, _a, "f", _A_baz);
6347
thing.; // Error
64-
__classPrivateFieldGet(thing, _A_foo).call(// Error
48+
__classPrivateFieldGet(thing, _A_foo, "f").call(// Error
6549
thing);
6650
}
6751
methodU(thing) {
68-
__classPrivateFieldGet(thing, _A_foo);
69-
__classStaticPrivateMethodGet(thing, _a, _A_m).call(thing);
70-
__classStaticPrivateFieldGet(thing, _a, _A_baz);
52+
__classPrivateFieldGet(thing, _A_foo, "f");
53+
__classPrivateFieldGet(thing, _a, "m", _A_m).call(thing);
54+
__classPrivateFieldGet(thing, _a, "f", _A_baz);
7155
thing.;
72-
__classPrivateFieldGet(thing, _A_foo).call(thing);
56+
__classPrivateFieldGet(thing, _A_foo, "f").call(thing);
7357
}
7458
methodN(thing) {
75-
__classPrivateFieldGet(thing, _A_foo);
76-
__classStaticPrivateMethodGet(thing, _a, _A_m).call(thing);
77-
__classStaticPrivateFieldGet(thing, _a, _A_baz);
59+
__classPrivateFieldGet(thing, _A_foo, "f");
60+
__classPrivateFieldGet(thing, _a, "m", _A_m).call(thing);
61+
__classPrivateFieldGet(thing, _a, "f", _A_baz);
7862
thing.;
79-
__classPrivateFieldGet(thing, _A_foo).call(thing);
63+
__classPrivateFieldGet(thing, _A_foo, "f").call(thing);
8064
}
8165
}
8266
_a = A, _A_foo = new WeakMap(), _A_m = function _A_m() { };

tests/baselines/reference/privateNameAndObjectRestSpread.js

+8-18
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,10 @@ class C {
1818

1919
//// [privateNameAndObjectRestSpread.js]
2020
"use strict";
21-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
22-
if (!privateMap.has(receiver)) {
23-
throw new TypeError("attempted to get private field on non-instance");
24-
}
25-
return privateMap.get(receiver);
26-
};
27-
var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) {
28-
if (receiver !== classConstructor) {
29-
throw new TypeError("Private static access of wrong provenance");
30-
}
31-
if (propertyDescriptor === undefined) {
32-
throw new TypeError("Private static field was accessed before its declaration.");
33-
}
34-
return propertyDescriptor.value;
21+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
22+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
23+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
24+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
3525
};
3626
var __rest = (this && this.__rest) || function (s, e) {
3727
var t = {};
@@ -51,13 +41,13 @@ class C {
5141
}
5242
method(other) {
5343
const obj = Object.assign({}, other);
54-
__classPrivateFieldGet(obj, _C_prop);
44+
__classPrivateFieldGet(obj, _C_prop, "f");
5545
const rest = __rest(other, []);
56-
__classPrivateFieldGet(rest, _C_prop);
46+
__classPrivateFieldGet(rest, _C_prop, "f");
5747
const statics = Object.assign({}, C);
58-
__classStaticPrivateFieldGet(statics, _a, _C_propStatic);
48+
__classPrivateFieldGet(statics, _a, "f", _C_propStatic);
5949
const sRest = __rest(C, []);
60-
__classStaticPrivateFieldGet(sRest, _a, _C_propStatic);
50+
__classPrivateFieldGet(sRest, _a, "f", _C_propStatic);
6151
}
6252
}
6353
_a = C, _C_prop = new WeakMap();

tests/baselines/reference/privateNameBadAssignment.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,11 @@ class C {
1616

1717

1818
//// [privateNameBadAssignment.js]
19-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {
20-
if (!privateMap.has(receiver)) {
21-
throw new TypeError("attempted to set private field on non-instance");
22-
}
23-
privateMap.set(receiver, value);
24-
return value;
19+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
20+
if (kind === "m") throw new TypeError("Private method is not writable");
21+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
22+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
23+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
2524
};
2625
var _C_bar;
2726
exports. = 1; // Error (outside class body)
@@ -33,7 +32,7 @@ B. = 3; // Error (outside class body)
3332
class C {
3433
constructor() {
3534
_C_bar.set(this, 6);
36-
__classPrivateFieldSet(exports, _C_bar, 6); // Error
35+
__classPrivateFieldSet(exports, _C_bar, 6, "f"); // Error
3736
this. = 3; // Error (undeclared)
3837
}
3938
}

tests/baselines/reference/privateNameCircularReference.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,16 @@ class A {
88

99
//// [privateNameCircularReference.js]
1010
"use strict";
11-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
12-
if (!privateMap.has(receiver)) {
13-
throw new TypeError("attempted to get private field on non-instance");
14-
}
15-
return privateMap.get(receiver);
11+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
1615
};
1716
var _A_foo, _A_bar;
1817
class A {
1918
constructor() {
20-
_A_foo.set(this, __classPrivateFieldGet(this, _A_bar));
21-
_A_bar.set(this, __classPrivateFieldGet(this, _A_foo));
19+
_A_foo.set(this, __classPrivateFieldGet(this, _A_bar, "f"));
20+
_A_bar.set(this, __classPrivateFieldGet(this, _A_foo, "f"));
2221
this["#baz"] = this["#baz"]; // Error (should *not* be private name error)
2322
}
2423
}

tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js

+17-19
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,16 @@ new A().test();
3838

3939

4040
//// [privateNameComputedPropertyName1.js]
41-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {
42-
if (!privateMap.has(receiver)) {
43-
throw new TypeError("attempted to set private field on non-instance");
44-
}
45-
privateMap.set(receiver, value);
46-
return value;
41+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
42+
if (kind === "m") throw new TypeError("Private method is not writable");
43+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
44+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
45+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
4746
};
48-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
49-
if (!privateMap.has(receiver)) {
50-
throw new TypeError("attempted to get private field on non-instance");
51-
}
52-
return privateMap.get(receiver);
47+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
48+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
49+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
50+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5351
};
5452
var _A_a, _A_b, _A_c, _A_d, _A_e;
5553
class A {
@@ -59,18 +57,18 @@ class A {
5957
_A_c.set(this, 'c');
6058
_A_d.set(this, void 0);
6159
_A_e.set(this, '');
62-
__classPrivateFieldSet(this, _A_b, 'b');
63-
__classPrivateFieldSet(this, _A_d, 'd');
60+
__classPrivateFieldSet(this, _A_b, 'b', "f");
61+
__classPrivateFieldSet(this, _A_d, 'd', "f");
6462
}
6563
test() {
6664
const data = { a: 'a', b: 'b', c: 'c', d: 'd', e: 'e' };
67-
const { [__classPrivateFieldGet(this, _A_a)]: a, [__classPrivateFieldGet(this, _A_b)]: b, [__classPrivateFieldGet(this, _A_c)]: c, [__classPrivateFieldGet(this, _A_d)]: d, [__classPrivateFieldSet(this, _A_e, 'e')]: e, } = data;
65+
const { [__classPrivateFieldGet(this, _A_a, "f")]: a, [__classPrivateFieldGet(this, _A_b, "f")]: b, [__classPrivateFieldGet(this, _A_c, "f")]: c, [__classPrivateFieldGet(this, _A_d, "f")]: d, [__classPrivateFieldSet(this, _A_e, 'e', "f")]: e, } = data;
6866
console.log(a, b, c, d, e);
69-
const a1 = data[__classPrivateFieldGet(this, _A_a)];
70-
const b1 = data[__classPrivateFieldGet(this, _A_b)];
71-
const c1 = data[__classPrivateFieldGet(this, _A_c)];
72-
const d1 = data[__classPrivateFieldGet(this, _A_d)];
73-
const e1 = data[__classPrivateFieldGet(this, _A_e)];
67+
const a1 = data[__classPrivateFieldGet(this, _A_a, "f")];
68+
const b1 = data[__classPrivateFieldGet(this, _A_b, "f")];
69+
const c1 = data[__classPrivateFieldGet(this, _A_c, "f")];
70+
const d1 = data[__classPrivateFieldGet(this, _A_d, "f")];
71+
const e1 = data[__classPrivateFieldGet(this, _A_e, "f")];
7472
console.log(a1, b1, c1, d1);
7573
}
7674
}

0 commit comments

Comments
 (0)