Skip to content

Commit b2f50bd

Browse files
author
Joseph Watts
committed
Transform initializers for private named instance fields
1 parent e3ff684 commit b2f50bd

File tree

1 file changed

+29
-3
lines changed

1 file changed

+29
-3
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,14 +346,15 @@ namespace ts {
346346
}
347347

348348
function transformClassMembers(node: ClassDeclaration | ClassExpression, isDerivedClass: boolean) {
349+
// Declare private names.
350+
const privateProperties = filter(node.members, isPrivatePropertyDeclaration);
351+
privateProperties.forEach(property => addPrivateNameToEnvironment(property.name));
352+
349353
const members: ClassElement[] = [];
350354
const constructor = transformConstructor(node, isDerivedClass);
351355
if (constructor) {
352356
members.push(constructor);
353357
}
354-
// Declare private names.
355-
const privateProperties = filter(node.members, isPrivatePropertyDeclaration);
356-
privateProperties.forEach(property => addPrivateNameToEnvironment(property.name));
357358

358359
addRange(members, visitNodes(node.members, classElementVisitor, isClassElement));
359360
return setTextRange(createNodeArray(members), /*location*/ node.members);
@@ -497,6 +498,21 @@ namespace ts {
497498
? updateComputedPropertyName(property.name, getGeneratedNameForNode(property.name))
498499
: property.name;
499500
const initializer = visitNode(property.initializer!, visitor, isExpression);
501+
502+
if (isPrivateName(propertyName)) {
503+
const privateNameInfo = accessPrivateName(propertyName);
504+
if (privateNameInfo) {
505+
switch (privateNameInfo.type) {
506+
case PrivateNameType.InstanceField: {
507+
return createCall(
508+
createPropertyAccess(privateNameInfo.weakMapName, "set"),
509+
/*typeArguments*/ undefined,
510+
[receiver, initializer]
511+
);
512+
}
513+
}
514+
}
515+
}
500516
const memberAccess = createMemberAccessForPropertyName(receiver, propertyName, /*location*/ propertyName);
501517

502518
return createAssignment(memberAccess, initializer);
@@ -530,6 +546,16 @@ namespace ts {
530546
);
531547
}
532548

549+
function accessPrivateName(name: PrivateName) {
550+
for (let i = privateNameEnvironmentStack.length - 1; i >= 0; --i) {
551+
const env = privateNameEnvironmentStack[i];
552+
if (env.has(name.escapedText)) {
553+
return env.get(name.escapedText);
554+
}
555+
}
556+
return undefined;
557+
}
558+
533559
function enableSubstitutionForClassAliases() {
534560
if ((enabledSubstitutions & ESNextSubstitutionFlags.ClassAliases) === 0) {
535561
enabledSubstitutions |= ESNextSubstitutionFlags.ClassAliases;

0 commit comments

Comments
 (0)