Skip to content

Commit 161a7b6

Browse files
Added support for static private fields accessors and methods.
1 parent 8bf51b9 commit 161a7b6

19 files changed

+400
-161
lines changed

src/compiler/checker.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39457,9 +39457,6 @@ namespace ts {
3945739457
else if (flags & ModifierFlags.Abstract) {
3945839458
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
3945939459
}
39460-
else if (isPrivateIdentifierClassElementDeclaration(node)) {
39461-
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "static");
39462-
}
3946339460
flags |= ModifierFlags.Static;
3946439461
lastStatic = modifier;
3946539462
break;

src/compiler/factory/emitHelpers.ts

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ namespace ts {
3939
createClassPrivateWriteonlyHelper(receiver: Expression): Expression;
4040
createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression;
4141
createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression): Expression;
42+
// Class Static Private Helpers
43+
createClassStaticPrivateFieldGetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier): Expression;
44+
createClassStaticPrivateFieldSetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier, value: Expression): Expression;
45+
createClassStaticPrivateMethodGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier): Expression;
46+
createClassStaticPrivateReadonlyHelper(receiver: Expression, value: Expression): Expression;
47+
createClassStaticPrivateWriteonlyHelper(receiver: Expression): Expression;
48+
createClassStaticPrivateAccessorGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier): Expression;
49+
createClassStaticPrivateAccessorSetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier, value: Expression): Expression;
4250
}
4351

4452
export function createEmitHelperFactory(context: TransformationContext): EmitHelperFactory {
@@ -82,6 +90,13 @@ namespace ts {
8290
createClassPrivateWriteonlyHelper,
8391
createClassPrivateAccessorGetHelper,
8492
createClassPrivateAccessorSetHelper,
93+
createClassStaticPrivateFieldGetHelper,
94+
createClassStaticPrivateFieldSetHelper,
95+
createClassStaticPrivateMethodGetHelper,
96+
createClassStaticPrivateReadonlyHelper,
97+
createClassStaticPrivateWriteonlyHelper,
98+
createClassStaticPrivateAccessorGetHelper,
99+
createClassStaticPrivateAccessorSetHelper,
85100
};
86101

87102
/**
@@ -412,6 +427,41 @@ namespace ts {
412427
context.requestEmitHelper(classPrivateAccessorSetHelper);
413428
return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorSet"), /*typeArguments*/ undefined, [receiver, instances, fn, value]);
414429
}
430+
// Class Private Static Helpers
431+
function createClassStaticPrivateFieldGetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier) {
432+
context.requestEmitHelper(classStaticPrivateFieldGetHelper);
433+
return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateFieldGet"), /*typeArguments*/ undefined, [receiver, classConstructor, privateField]);
434+
}
435+
436+
function createClassStaticPrivateFieldSetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier, value: Expression) {
437+
context.requestEmitHelper(classStaticPrivateFieldSetHelper);
438+
return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateFieldSet"), /*typeArguments*/ undefined, [receiver, classConstructor, privateField, value]);
439+
}
440+
441+
function createClassStaticPrivateMethodGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier) {
442+
context.requestEmitHelper(classStaticPrivateMethodGetHelper);
443+
return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn]);
444+
}
445+
446+
function createClassStaticPrivateReadonlyHelper(receiver: Expression, value: Expression) {
447+
context.requestEmitHelper(classStaticPrivateReadonlyHelper);
448+
return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateReadonly"), /*typeArguments*/ undefined, [receiver, value]);
449+
}
450+
451+
function createClassStaticPrivateWriteonlyHelper(receiver: Expression) {
452+
context.requestEmitHelper(classStaticPrivateWriteonlyHelper);
453+
return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateWriteonly"), /*typeArguments*/ undefined, [receiver]);
454+
}
455+
456+
function createClassStaticPrivateAccessorGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier) {
457+
context.requestEmitHelper(classStaticPrivateAccessorGetHelper);
458+
return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateAccessorGet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn]);
459+
}
460+
461+
function createClassStaticPrivateAccessorSetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier, value: Expression) {
462+
context.requestEmitHelper(classStaticPrivateAccessorSetHelper);
463+
return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateAccessorSet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn, value]);
464+
}
415465
}
416466

417467
/* @internal */
@@ -939,6 +989,93 @@ namespace ts {
939989
};`
940990
};
941991

992+
export const classStaticPrivateFieldGetHelper: UnscopedEmitHelper = {
993+
name: "typescript:classStaticPrivateFieldGet",
994+
importName: "__classStaticPrivateFieldGet",
995+
scoped: false,
996+
text: `
997+
var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) {
998+
if (receiver !== classConstructor) {
999+
throw new TypeError("Private static access of wrong provenance");
1000+
}
1001+
return propertyDescriptor.value;
1002+
};`
1003+
};
1004+
1005+
export const classStaticPrivateFieldSetHelper: UnscopedEmitHelper = {
1006+
name: "typescript:classStaticPrivateFieldSet",
1007+
importName: "__classStaticPrivateFieldSet",
1008+
scoped: false,
1009+
text: `
1010+
var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) {
1011+
if (receiver !== classConstructor) {
1012+
throw new TypeError("Private static access of wrong provenance");
1013+
}
1014+
propertyDescriptor.value = value;
1015+
return value;
1016+
};`
1017+
};
1018+
1019+
export const classStaticPrivateMethodGetHelper: UnscopedEmitHelper = {
1020+
name: "typescript:classStaticPrivateMethodGet",
1021+
importName: "__classStaticPrivateMethodGet",
1022+
scoped: false,
1023+
text: `
1024+
var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) {
1025+
if (receiver !== classConstructor) {
1026+
throw new TypeError("Private static access of wrong provenance");
1027+
}
1028+
return fn;
1029+
};`
1030+
};
1031+
1032+
export const classStaticPrivateReadonlyHelper: UnscopedEmitHelper = {
1033+
name: "typescript:classStaticPrivateReadonly",
1034+
importName: "__classStaticPrivateReadonly",
1035+
scoped: false,
1036+
text: `
1037+
var __classStaticPrivateReadonly = (this && this.__classStaticPrivateReadonly) || function () {
1038+
throw new TypeError("Private static element is not writable");
1039+
};`
1040+
};
1041+
1042+
export const classStaticPrivateWriteonlyHelper: UnscopedEmitHelper = {
1043+
name: "typescript:classStaticPrivateWriteonly",
1044+
importName: "__classStaticPrivateWriteonly",
1045+
scoped: false,
1046+
text: `
1047+
var __classStaticPrivateWriteonly = (this && this.__classStaticPrivateWriteonly) || function () {
1048+
throw new TypeError("Private static element is not readable");
1049+
};`
1050+
};
1051+
1052+
export const classStaticPrivateAccessorGetHelper: UnscopedEmitHelper = {
1053+
name: "typescript:classStaticPrivateAccessorGet",
1054+
importName: "__classStaticPrivateAccessorGet",
1055+
scoped: false,
1056+
text: `
1057+
var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) {
1058+
if (receiver !== classConstructor) {
1059+
throw new TypeError("Private static access of wrong provenance");
1060+
}
1061+
return fn.call(receiver);
1062+
};`
1063+
};
1064+
1065+
export const classStaticPrivateAccessorSetHelper: UnscopedEmitHelper = {
1066+
name: "typescript:classStaticPrivateAccessorSet",
1067+
importName: "__classStaticPrivateAccessorSet",
1068+
scoped: false,
1069+
text: `
1070+
var __classStaticPrivateAccessorSet = (this && this.__classStaticPrivateAccessorSet) || function (receiver, classConstructor, fn, value) {
1071+
if (receiver !== classConstructor) {
1072+
throw new TypeError("Private static access of wrong provenance");
1073+
}
1074+
fn.call(receiver, value);
1075+
return value;
1076+
};`
1077+
};
1078+
9421079
let allUnscopedEmitHelpers: ReadonlyESMap<string, UnscopedEmitHelper> | undefined;
9431080

9441081
export function getAllUnscopedEmitHelpers() {

0 commit comments

Comments
 (0)