Skip to content

Commit c527c53

Browse files
author
Joseph Watts
committed
Transform assignments to private named instance fields
1 parent 965b54e commit c527c53

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,46 @@ namespace ts {
762762
visitNode(node.right, noDestructuringValue ? visitorNoDestructuringValue : visitor, isExpression)
763763
);
764764
}
765+
else if (isAssignmentExpression(node) && isPropertyAccessExpression(node.left) && isPrivateName(node.left.name)) {
766+
const privateNameInfo = accessPrivateName(node.left.name);
767+
if (privateNameInfo && privateNameInfo.type === PrivateNameType.InstanceField) {
768+
if (isCompoundAssignment(node.operatorToken.kind)) {
769+
const isReceiverInlineable = isSimpleInlineableExpression(node.left.expression);
770+
const getReceiver = isReceiverInlineable ? node.left.expression : createTempVariable(hoistVariableDeclaration);
771+
const setReceiver = isReceiverInlineable
772+
? node.left.expression
773+
: createAssignment(getReceiver, node.left.expression);
774+
return setOriginalNode(
775+
createClassPrivateFieldSetHelper(
776+
context,
777+
setReceiver,
778+
privateNameInfo.weakMapName,
779+
createBinary(
780+
createClassPrivateFieldGetHelper(
781+
context,
782+
getReceiver,
783+
privateNameInfo.weakMapName
784+
),
785+
getOperatorForCompoundAssignment(node.operatorToken.kind),
786+
visitNode(node.right, visitor)
787+
)
788+
),
789+
node
790+
);
791+
}
792+
else {
793+
return setOriginalNode(
794+
createClassPrivateFieldSetHelper(
795+
context,
796+
node.left.expression,
797+
privateNameInfo.weakMapName,
798+
visitNode(node.right, visitor)
799+
),
800+
node
801+
);
802+
}
803+
}
804+
}
765805
return visitEachChild(node, visitor, context);
766806
}
767807

@@ -1599,4 +1639,15 @@ namespace ts {
15991639
context.requestEmitHelper(classPrivateFieldGetHelper);
16001640
return createCall(getHelperName("_classPrivateFieldGet"), /* typeArguments */ undefined, [receiver, privateField]);
16011641
}
1642+
1643+
const classPrivateFieldSetHelper: EmitHelper = {
1644+
name: "typescript:classPrivateFieldSet",
1645+
scoped: false,
1646+
text: `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; };`
1647+
};
1648+
1649+
function createClassPrivateFieldSetHelper(context: TransformationContext, receiver: Expression, privateField: Identifier, value: Expression) {
1650+
context.requestEmitHelper(classPrivateFieldSetHelper);
1651+
return createCall(getHelperName("_classPrivateFieldSet"), /* typeArguments */ undefined, [receiver, privateField, value]);
1652+
}
16021653
}

0 commit comments

Comments
 (0)