Skip to content

Commit 5a12944

Browse files
author
Joseph Watts
committed
Transform assignments to private named instance fields
1 parent 741f330 commit 5a12944

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
@@ -745,6 +745,46 @@ namespace ts {
745745
visitNode(node.right, noDestructuringValue ? visitorNoDestructuringValue : visitor, isExpression)
746746
);
747747
}
748+
else if (isAssignmentExpression(node) && isPropertyAccessExpression(node.left) && isPrivateName(node.left.name)) {
749+
const privateNameInfo = accessPrivateName(node.left.name);
750+
if (privateNameInfo && privateNameInfo.type === PrivateNameType.InstanceField) {
751+
if (isCompoundAssignment(node.operatorToken.kind)) {
752+
const isReceiverInlineable = isSimpleInlineableExpression(node.left.expression);
753+
const getReceiver = isReceiverInlineable ? node.left.expression : createTempVariable(hoistVariableDeclaration);
754+
const setReceiver = isReceiverInlineable
755+
? node.left.expression
756+
: createAssignment(getReceiver, node.left.expression);
757+
return setOriginalNode(
758+
createClassPrivateFieldSetHelper(
759+
context,
760+
setReceiver,
761+
privateNameInfo.weakMapName,
762+
createBinary(
763+
createClassPrivateFieldGetHelper(
764+
context,
765+
getReceiver,
766+
privateNameInfo.weakMapName
767+
),
768+
getOperatorForCompoundAssignment(node.operatorToken.kind),
769+
visitNode(node.right, visitor)
770+
)
771+
),
772+
node
773+
);
774+
}
775+
else {
776+
return setOriginalNode(
777+
createClassPrivateFieldSetHelper(
778+
context,
779+
node.left.expression,
780+
privateNameInfo.weakMapName,
781+
visitNode(node.right, visitor)
782+
),
783+
node
784+
);
785+
}
786+
}
787+
}
748788
return visitEachChild(node, visitor, context);
749789
}
750790

@@ -1554,4 +1594,15 @@ namespace ts {
15541594
context.requestEmitHelper(classPrivateFieldGetHelper);
15551595
return createCall(getHelperName("_classPrivateFieldGet"), /* typeArguments */ undefined, [receiver, privateField]);
15561596
}
1597+
1598+
const classPrivateFieldSetHelper: EmitHelper = {
1599+
name: "typescript:classPrivateFieldSet",
1600+
scoped: false,
1601+
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; };`
1602+
};
1603+
1604+
function createClassPrivateFieldSetHelper(context: TransformationContext, receiver: Expression, privateField: Identifier, value: Expression) {
1605+
context.requestEmitHelper(classPrivateFieldSetHelper);
1606+
return createCall(getHelperName("_classPrivateFieldSet"), /* typeArguments */ undefined, [receiver, privateField, value]);
1607+
}
15571608
}

0 commit comments

Comments
 (0)