Skip to content

Commit 9fefba1

Browse files
Merge pull request #48 from bloomberg/es-private-methods-emit
Private methods emit
2 parents 90d2914 + 8bf51b9 commit 9fefba1

File tree

100 files changed

+2042
-721
lines changed

Some content is hidden

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

100 files changed

+2042
-721
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -32226,7 +32226,7 @@ namespace ts {
3222632226
}
3222732227

3222832228
// Private named methods are only allowed in class declarations
32229-
if (isPrivateIdentifier(node.name) && !isClassDeclaration(node.parent)) {
32229+
if (isPrivateIdentifier(node.name) && !getContainingClass(node)) {
3223032230
error(node, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies);
3223132231
}
3223232232
}

src/compiler/factory/emitHelpers.ts

+101-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ namespace ts {
3434
// Class Fields Helpers
3535
createClassPrivateFieldGetHelper(receiver: Expression, privateField: Identifier): Expression;
3636
createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression): Expression;
37+
createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression;
38+
createClassPrivateReadonlyHelper(receiver: Expression, value: Expression): Expression;
39+
createClassPrivateWriteonlyHelper(receiver: Expression): Expression;
40+
createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression;
41+
createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression): Expression;
3742
}
3843

3944
export function createEmitHelperFactory(context: TransformationContext): EmitHelperFactory {
@@ -72,6 +77,11 @@ namespace ts {
7277
// Class Fields Helpers
7378
createClassPrivateFieldGetHelper,
7479
createClassPrivateFieldSetHelper,
80+
createClassPrivateMethodGetHelper,
81+
createClassPrivateReadonlyHelper,
82+
createClassPrivateWriteonlyHelper,
83+
createClassPrivateAccessorGetHelper,
84+
createClassPrivateAccessorSetHelper,
7585
};
7686

7787
/**
@@ -377,6 +387,31 @@ namespace ts {
377387
context.requestEmitHelper(classPrivateFieldSetHelper);
378388
return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldSet"), /*typeArguments*/ undefined, [receiver, privateField, value]);
379389
}
390+
391+
function createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier) {
392+
context.requestEmitHelper(classPrivateMethodGetHelper);
393+
return factory.createCallExpression(getUnscopedHelperName("__classPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, instances, fn]);
394+
}
395+
396+
function createClassPrivateReadonlyHelper(receiver: Expression, value: Expression) {
397+
context.requestEmitHelper(classPrivateReadonlyHelper);
398+
return factory.createCallExpression(getUnscopedHelperName("__classPrivateReadonly"), /*typeArguments*/ undefined, [receiver, value]);
399+
}
400+
401+
function createClassPrivateWriteonlyHelper(receiver: Expression) {
402+
context.requestEmitHelper(classPrivateWriteonlyHelper);
403+
return factory.createCallExpression(getUnscopedHelperName("__classPrivateWriteonly"), /*typeArguments*/ undefined, [receiver]);
404+
}
405+
406+
function createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier) {
407+
context.requestEmitHelper(classPrivateAccessorGetHelper);
408+
return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorGet"), /*typeArguments*/ undefined, [receiver, instances, fn]);
409+
}
410+
411+
function createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression) {
412+
context.requestEmitHelper(classPrivateAccessorSetHelper);
413+
return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorSet"), /*typeArguments*/ undefined, [receiver, instances, fn, value]);
414+
}
380415
}
381416

382417
/* @internal */
@@ -844,6 +879,66 @@ namespace ts {
844879
};`
845880
};
846881

882+
export const classPrivateMethodGetHelper: UnscopedEmitHelper = {
883+
name: "typescript:classPrivateMethodGet",
884+
importName: "__classPrivateMethodGet",
885+
scoped: false,
886+
text: `
887+
var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) {
888+
if (!instances.has(receiver)) {
889+
throw new TypeError("attempted to get private method on non-instance");
890+
}
891+
return fn;
892+
};`
893+
};
894+
895+
export const classPrivateReadonlyHelper: UnscopedEmitHelper = {
896+
name: "typescript:classPrivateReadonly",
897+
importName: "__classPrivateReadonly",
898+
scoped: false,
899+
text: `
900+
var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () {
901+
throw new TypeError("private element is not writable");
902+
};`
903+
};
904+
905+
export const classPrivateWriteonlyHelper: UnscopedEmitHelper = {
906+
name: "typescript:classPrivateWriteonly",
907+
importName: "__classPrivateWriteonly",
908+
scoped: false,
909+
text: `
910+
var __classPrivateWriteonly = (this && this.__classPrivateWriteonly) || function () {
911+
throw new TypeError("private setter was defined without a getter");
912+
};`
913+
};
914+
915+
export const classPrivateAccessorGetHelper: UnscopedEmitHelper = {
916+
name: "typescript:classPrivateAccessorGet",
917+
importName: "__classPrivateAccessorGet",
918+
scoped: false,
919+
text: `
920+
var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) {
921+
if (!instances.has(receiver)) {
922+
throw new TypeError("attempted to get private accessor on non-instance");
923+
}
924+
return fn.call(receiver);
925+
};`
926+
};
927+
928+
export const classPrivateAccessorSetHelper: UnscopedEmitHelper = {
929+
name: "typescript:classPrivateAccessorSet",
930+
importName: "__classPrivateAccessorSet",
931+
scoped: false,
932+
text: `
933+
var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) {
934+
if (!instances.has(receiver)) {
935+
throw new TypeError("attempted to set private accessor on non-instance");
936+
}
937+
fn.call(receiver, value);
938+
return value;
939+
};`
940+
};
941+
847942
let allUnscopedEmitHelpers: ReadonlyESMap<string, UnscopedEmitHelper> | undefined;
848943

849944
export function getAllUnscopedEmitHelpers() {
@@ -869,6 +964,11 @@ namespace ts {
869964
exportStarHelper,
870965
classPrivateFieldGetHelper,
871966
classPrivateFieldSetHelper,
967+
classPrivateMethodGetHelper,
968+
classPrivateReadonlyHelper,
969+
classPrivateWriteonlyHelper,
970+
classPrivateAccessorGetHelper,
971+
classPrivateAccessorSetHelper,
872972
createBindingHelper,
873973
setModuleDefaultHelper
874974
], helper => helper.name));
@@ -897,4 +997,4 @@ namespace ts {
897997
&& (getEmitFlags(firstSegment.expression) & EmitFlags.HelperName)
898998
&& firstSegment.expression.escapedText === helperName;
899999
}
900-
}
1000+
}

0 commit comments

Comments
 (0)