Skip to content

Commit 3d78b7f

Browse files
Max Heibermheiber
Max Heiber
authored andcommitted
simplify and fixes for private methods emit
- also: use createUniqueName instead of createFileLevelUniqueName to avoid name conflicts Signed-off-by: Max Heiber <[email protected]> Signed-off-by: Max Heiber <[email protected]>
1 parent ab3a3b1 commit 3d78b7f

14 files changed

+173
-112
lines changed

src/compiler/transformers/esnext.ts

+31-41
Original file line numberDiff line numberDiff line change
@@ -414,17 +414,8 @@ namespace ts {
414414
const containsPropertyInitializer = forEach(node.members, isInitializedProperty);
415415
let body = constructor ? constructor.body : undefined;
416416
let parameters = constructor ? constructor.parameters : undefined;
417-
const shouldTransformConstructorBody = containsPropertyInitializer || declaresPrivateNames;
418-
if (shouldTransformConstructorBody) {
419-
if (containsPropertyInitializer) {
420-
parameters = visitParameterList(constructor ? constructor.parameters : undefined, visitor, context);
421-
}
422-
else {
423-
// provide a scope for hoisted declarations for WeakSet or WeakMap for private name brand checks
424-
// not needed if `visitParameterList` was called, because that starts/suspends the lexical environment
425-
context.startLexicalEnvironment();
426-
context.suspendLexicalEnvironment();
427-
}
417+
if (containsPropertyInitializer || declaresPrivateNames) {
418+
parameters = visitParameterList(constructor ? constructor.parameters : undefined, visitor, context);
428419
body = transformConstructorBody(node, constructor, isDerivedClass, declaresPrivateNames);
429420
}
430421
if (!body) {
@@ -486,22 +477,11 @@ namespace ts {
486477
indexOfFirstStatement = addPrologueDirectivesAndInitialSuperCall(constructor, statements, visitor);
487478
}
488479

489-
// Add the property initializers. Transforms this:
490-
//
491-
// public x = 1;
492-
//
493-
// Into this:
494-
//
495-
// constructor() {
496-
// this.x = 1;
497-
// }
498-
//
499-
addInitializedPropertyStatements(statements, properties, createThis());
500480
if (classDeclaresPrivateNames) {
501481
last(privateNameEnvironmentStack).forEach(({ placement, accumulator }) => {
502482
switch (placement) {
503483
case PrivateNamePlacement.InstanceField:
504-
// TODO: instance field add accumulator
484+
// handled in addInitializedPropertyStatements
505485
break;
506486
case PrivateNamePlacement.InstanceMethod:
507487
statements.push(
@@ -517,6 +497,17 @@ namespace ts {
517497
}
518498
});
519499
}
500+
// Add the property initializers. Transforms this:
501+
//
502+
// public x = 1;
503+
//
504+
// Into this:
505+
//
506+
// constructor() {
507+
// this.x = 1;
508+
// }
509+
//
510+
addInitializedPropertyStatements(statements, properties, createThis());
520511

521512
// Add existing statements, skipping the initial super call.
522513
if (constructor) {
@@ -656,7 +647,7 @@ namespace ts {
656647
function addPrivateName(element: ClassElement & { name: PrivateName }) {
657648
const env = last(privateNameEnvironmentStack);
658649
const text = getTextOfPropertyName(element.name) as string;
659-
const accumulator = createFileLevelUniqueName(`_${text.substring(1)}Private`);
650+
const accumulator = createUniqueName(`_${text.substring(1)}`);
660651
const { escapedText } = element.name;
661652
hoistVariableDeclaration(accumulator);
662653

@@ -673,7 +664,7 @@ namespace ts {
673664
identifierName = "WeakSet";
674665
const escapedText = element.name.escapedText;
675666
const escapedTextNoHash = `_${`${escapedText}`.slice(1)}`;
676-
const funcName: Identifier = createFileLevelUniqueName(escapedTextNoHash);
667+
const funcName: Identifier = createUniqueName(escapedTextNoHash);
677668
env.set(escapedText, { placement: PrivateNamePlacement.InstanceMethod, accumulator, funcName, origFunc: element });
678669
hoistVariableDeclaration(funcName); // todo: hoist in lexical, not func scope
679670
}
@@ -705,21 +696,18 @@ namespace ts {
705696
function visitPropertyAccessExpression(node: PropertyAccessExpression) {
706697
if (isPrivateName(node.name)) {
707698
const privateNameInfo = accessPrivateName(node.name);
708-
if (privateNameInfo) {
709-
switch (privateNameInfo.placement) {
710-
case PrivateNamePlacement.InstanceField:
711-
return setOriginalNode(
712-
setTextRange(
713-
createClassPrivateFieldGetHelper(
714-
context,
715-
visitNode(node.expression, visitor, isExpression),
716-
privateNameInfo.accumulator
717-
),
718-
node
719-
),
720-
node
721-
);
722-
}
699+
if (privateNameInfo && privateNameInfo.placement === PrivateNamePlacement.InstanceField) {
700+
return setOriginalNode(
701+
setTextRange(
702+
createClassPrivateFieldGetHelper(
703+
context,
704+
visitNode(node.expression, visitor, isExpression),
705+
privateNameInfo.accumulator
706+
),
707+
node
708+
),
709+
node
710+
);
723711
}
724712
}
725713
return visitEachChild(node, visitor, context);
@@ -808,7 +796,9 @@ namespace ts {
808796
);
809797
receiver = generatedName;
810798
}
811-
const privateNameEntry = last(privateNameEnvironmentStack).get(node.expression.name.escapedText);
799+
const privateNameEntry = privateNameEnvironmentStack.length
800+
? last(privateNameEnvironmentStack).get(node.expression.name.escapedText)
801+
: undefined;
812802
if (privateNameEntry && privateNameEntry.placement === PrivateNamePlacement.InstanceMethod) {
813803
return setOriginalNode(
814804
setTextRange(

tests/baselines/reference/privateNameField.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ class A {
88

99
//// [privateNameField.js]
1010
var _classPrivateFieldSet = function (receiver, privateMap, value) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } privateMap.set(receiver, value); return value; };
11-
var _namePrivate;
11+
var _name_1;
1212
var A = /** @class */ (function () {
1313
function A(name) {
14-
_namePrivate.set(this, void 0);
15-
_classPrivateFieldSet(this, _namePrivate, name);
14+
_name_1.set(this, void 0);
15+
_classPrivateFieldSet(this, _name_1, name);
1616
}
1717
return A;
1818
}());
19-
_namePrivate = new WeakMap();
19+
_name_1 = new WeakMap();

tests/baselines/reference/privateNameFieldAccess.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ class A {
99

1010
//// [privateNameFieldAccess.js]
1111
var _classPrivateFieldGet = function (receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return privateMap.get(receiver); };
12-
var _myFieldPrivate;
12+
var _myField_1;
1313
var A = /** @class */ (function () {
1414
function A() {
15-
_myFieldPrivate.set(this, "hello world");
16-
console.log(_classPrivateFieldGet(this, _myFieldPrivate));
15+
_myField_1.set(this, "hello world");
16+
console.log(_classPrivateFieldGet(this, _myField_1));
1717
}
1818
return A;
1919
}());
20-
_myFieldPrivate = new WeakMap();
20+
_myField_1 = new WeakMap();

tests/baselines/reference/privateNameFieldAssignment.js

+29-29
Original file line numberDiff line numberDiff line change
@@ -38,41 +38,41 @@ class A {
3838
//// [privateNameFieldAssignment.js]
3939
var _classPrivateFieldSet = function (receiver, privateMap, value) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } privateMap.set(receiver, value); return value; };
4040
var _classPrivateFieldGet = function (receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return privateMap.get(receiver); };
41-
var _fieldPrivate;
41+
var _field_1;
4242
var A = /** @class */ (function () {
4343
function A() {
44-
_fieldPrivate.set(this, 0);
44+
_field_1.set(this, 0);
4545
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
46-
_classPrivateFieldSet(this, _fieldPrivate, 1);
47-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) + 2);
48-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) - 3);
49-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) / 4);
50-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) * 5);
51-
_classPrivateFieldSet(this, _fieldPrivate, Math.pow(_classPrivateFieldGet(this, _fieldPrivate), 6));
52-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) % 7);
53-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) << 8);
54-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) >> 9);
55-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) >>> 10);
56-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) & 11);
57-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) | 12);
58-
_classPrivateFieldSet(this, _fieldPrivate, _classPrivateFieldGet(this, _fieldPrivate) ^ 13);
59-
_classPrivateFieldSet(A.getInstance(), _fieldPrivate, 1);
60-
_classPrivateFieldSet(_a = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_a, _fieldPrivate) + 2);
61-
_classPrivateFieldSet(_b = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_b, _fieldPrivate) - 3);
62-
_classPrivateFieldSet(_c = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_c, _fieldPrivate) / 4);
63-
_classPrivateFieldSet(_d = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_d, _fieldPrivate) * 5);
64-
_classPrivateFieldSet(_e = A.getInstance(), _fieldPrivate, Math.pow(_classPrivateFieldGet(_e, _fieldPrivate), 6));
65-
_classPrivateFieldSet(_f = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_f, _fieldPrivate) % 7);
66-
_classPrivateFieldSet(_g = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_g, _fieldPrivate) << 8);
67-
_classPrivateFieldSet(_h = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_h, _fieldPrivate) >> 9);
68-
_classPrivateFieldSet(_j = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_j, _fieldPrivate) >>> 10);
69-
_classPrivateFieldSet(_k = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_k, _fieldPrivate) & 11);
70-
_classPrivateFieldSet(_l = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_l, _fieldPrivate) | 12);
71-
_classPrivateFieldSet(_m = A.getInstance(), _fieldPrivate, _classPrivateFieldGet(_m, _fieldPrivate) ^ 13);
46+
_classPrivateFieldSet(this, _field_1, 1);
47+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) + 2);
48+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) - 3);
49+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) / 4);
50+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) * 5);
51+
_classPrivateFieldSet(this, _field_1, Math.pow(_classPrivateFieldGet(this, _field_1), 6));
52+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) % 7);
53+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) << 8);
54+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) >> 9);
55+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) >>> 10);
56+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) & 11);
57+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) | 12);
58+
_classPrivateFieldSet(this, _field_1, _classPrivateFieldGet(this, _field_1) ^ 13);
59+
_classPrivateFieldSet(A.getInstance(), _field_1, 1);
60+
_classPrivateFieldSet(_a = A.getInstance(), _field_1, _classPrivateFieldGet(_a, _field_1) + 2);
61+
_classPrivateFieldSet(_b = A.getInstance(), _field_1, _classPrivateFieldGet(_b, _field_1) - 3);
62+
_classPrivateFieldSet(_c = A.getInstance(), _field_1, _classPrivateFieldGet(_c, _field_1) / 4);
63+
_classPrivateFieldSet(_d = A.getInstance(), _field_1, _classPrivateFieldGet(_d, _field_1) * 5);
64+
_classPrivateFieldSet(_e = A.getInstance(), _field_1, Math.pow(_classPrivateFieldGet(_e, _field_1), 6));
65+
_classPrivateFieldSet(_f = A.getInstance(), _field_1, _classPrivateFieldGet(_f, _field_1) % 7);
66+
_classPrivateFieldSet(_g = A.getInstance(), _field_1, _classPrivateFieldGet(_g, _field_1) << 8);
67+
_classPrivateFieldSet(_h = A.getInstance(), _field_1, _classPrivateFieldGet(_h, _field_1) >> 9);
68+
_classPrivateFieldSet(_j = A.getInstance(), _field_1, _classPrivateFieldGet(_j, _field_1) >>> 10);
69+
_classPrivateFieldSet(_k = A.getInstance(), _field_1, _classPrivateFieldGet(_k, _field_1) & 11);
70+
_classPrivateFieldSet(_l = A.getInstance(), _field_1, _classPrivateFieldGet(_l, _field_1) | 12);
71+
_classPrivateFieldSet(_m = A.getInstance(), _field_1, _classPrivateFieldGet(_m, _field_1) ^ 13);
7272
}
7373
A.getInstance = function () {
7474
return new A();
7575
};
7676
return A;
7777
}());
78-
_fieldPrivate = new WeakMap();
78+
_field_1 = new WeakMap();

tests/baselines/reference/privateNameFieldCallExpression.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@ class A {
1212

1313
//// [privateNameFieldCallExpression.js]
1414
var _classPrivateFieldGet = function (receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return privateMap.get(receiver); };
15-
var _fieldFuncPrivate;
15+
var _fieldFunc_1;
1616
var A = /** @class */ (function () {
1717
function A() {
1818
var _this = this;
19-
_fieldFuncPrivate.set(this, function () { return _this.x = 10; });
19+
_fieldFunc_1.set(this, function () { return _this.x = 10; });
2020
this.x = 1;
2121
}
2222
A.prototype.test = function () {
23-
_classPrivateFieldGet(this, _fieldFuncPrivate).call(this);
24-
var func = _classPrivateFieldGet(this, _fieldFuncPrivate);
23+
_classPrivateFieldGet(this, _fieldFunc_1).call(this);
24+
var func = _classPrivateFieldGet(this, _fieldFunc_1);
2525
func();
2626
};
2727
return A;
2828
}());
29-
_fieldFuncPrivate = new WeakMap();
29+
_fieldFunc_1 = new WeakMap();

tests/baselines/reference/privateNameFieldDeclaration.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ class A {
55

66

77
//// [privateNameFieldDeclaration.js]
8-
var _namePrivate;
8+
var _name_1;
99
var A = /** @class */ (function () {
1010
function A() {
11-
_namePrivate.set(this, void 0);
11+
_name_1.set(this, void 0);
1212
}
1313
return A;
1414
}());
15-
_namePrivate = new WeakMap();
15+
_name_1 = new WeakMap();

tests/baselines/reference/privateNameFieldDestructuredBinding.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ class A {
1717

1818
//// [privateNameFieldDestructuredBinding.js]
1919
var _classPrivateFieldGet = function (receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return privateMap.get(receiver); };
20-
var _fieldPrivate;
20+
var _field_1;
2121
var A = /** @class */ (function () {
2222
function A() {
23-
_fieldPrivate.set(this, 1);
23+
_field_1.set(this, 1);
2424
var _a, _b;
2525
var y;
26-
(_a = this.testObject(), { set value(x) { _classPrivateFieldGet(this, _fieldPrivate) = x; } }.value = _a.x, y = _a.y);
27-
(_b = this.testArray(), { set value(x) { _classPrivateFieldGet(this, _fieldPrivate) = x; } }.value = _b[0], y = _b[1]);
26+
(_a = this.testObject(), { set value(x) { _classPrivateFieldGet(this, _field_1) = x; } }.value = _a.x, y = _a.y);
27+
(_b = this.testArray(), { set value(x) { _classPrivateFieldGet(this, _field_1) = x; } }.value = _b[0], y = _b[1]);
2828
}
2929
A.prototype.testObject = function () {
3030
return { x: 10, y: 6 };
@@ -34,4 +34,4 @@ var A = /** @class */ (function () {
3434
};
3535
return A;
3636
}());
37-
_fieldPrivate = new WeakMap();
37+
_field_1 = new WeakMap();

tests/baselines/reference/privateNameFieldInitializer.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ class A {
66

77

88
//// [privateNameFieldInitializer.js]
9-
var _fieldPrivate, _uninitializedPrivate;
9+
var _field_1, _uninitialized_1;
1010
var A = /** @class */ (function () {
1111
function A() {
12-
_fieldPrivate.set(this, 10);
13-
_uninitializedPrivate.set(this, void 0);
12+
_field_1.set(this, 10);
13+
_uninitialized_1.set(this, void 0);
1414
}
1515
return A;
1616
}());
17-
_fieldPrivate = new WeakMap(), _uninitializedPrivate = new WeakMap();
17+
_field_1 = new WeakMap(), _uninitialized_1 = new WeakMap();

tests/baselines/reference/privateNameFieldUnaryMutation.js

+11-11
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,24 @@ class C {
2020
//// [privateNameFieldUnaryMutation.js]
2121
var _classPrivateFieldGet = function (receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return privateMap.get(receiver); };
2222
var _classPrivateFieldSet = function (receiver, privateMap, value) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } privateMap.set(receiver, value); return value; };
23-
var _testPrivate;
23+
var _test_1;
2424
var C = /** @class */ (function () {
2525
function C() {
26-
_testPrivate.set(this, 24);
26+
_test_1.set(this, 24);
2727
var _a, _b;
28-
_a = _classPrivateFieldGet(this, _testPrivate), _classPrivateFieldSet(this, _testPrivate, _a + 1), _a;
29-
_b = _classPrivateFieldGet(this, _testPrivate), _classPrivateFieldSet(this, _testPrivate, _b - 1), _b;
30-
_classPrivateFieldSet(this, _testPrivate, _classPrivateFieldGet(this, _testPrivate) + 1);
31-
_classPrivateFieldSet(this, _testPrivate, _classPrivateFieldGet(this, _testPrivate) - 1);
28+
_a = _classPrivateFieldGet(this, _test_1), _classPrivateFieldSet(this, _test_1, _a + 1), _a;
29+
_b = _classPrivateFieldGet(this, _test_1), _classPrivateFieldSet(this, _test_1, _b - 1), _b;
30+
_classPrivateFieldSet(this, _test_1, _classPrivateFieldGet(this, _test_1) + 1);
31+
_classPrivateFieldSet(this, _test_1, _classPrivateFieldGet(this, _test_1) - 1);
3232
}
3333
C.prototype.test = function () {
3434
var _a, _b, _c, _d, _e, _f;
35-
_a = this.getInstance(), _b = _classPrivateFieldGet(_a, _testPrivate), _classPrivateFieldSet(_a, _testPrivate, _b + 1), _b;
36-
_c = this.getInstance(), _d = _classPrivateFieldGet(_c, _testPrivate), _classPrivateFieldSet(_c, _testPrivate, _d - 1), _d;
37-
_classPrivateFieldSet(_e = this.getInstance(), _testPrivate, _classPrivateFieldGet(_e, _testPrivate) + 1);
38-
_classPrivateFieldSet(_f = this.getInstance(), _testPrivate, _classPrivateFieldGet(_f, _testPrivate) - 1);
35+
_a = this.getInstance(), _b = _classPrivateFieldGet(_a, _test_1), _classPrivateFieldSet(_a, _test_1, _b + 1), _b;
36+
_c = this.getInstance(), _d = _classPrivateFieldGet(_c, _test_1), _classPrivateFieldSet(_c, _test_1, _d - 1), _d;
37+
_classPrivateFieldSet(_e = this.getInstance(), _test_1, _classPrivateFieldGet(_e, _test_1) + 1);
38+
_classPrivateFieldSet(_f = this.getInstance(), _test_1, _classPrivateFieldGet(_f, _test_1) - 1);
3939
};
4040
C.prototype.getInstance = function () { return new C(); };
4141
return C;
4242
}());
43-
_testPrivate = new WeakMap();
43+
_test_1 = new WeakMap();

0 commit comments

Comments
 (0)