@@ -745,6 +745,46 @@ namespace ts {
745
745
visitNode ( node . right , noDestructuringValue ? visitorNoDestructuringValue : visitor , isExpression )
746
746
) ;
747
747
}
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
+ }
748
788
return visitEachChild ( node , visitor , context ) ;
749
789
}
750
790
@@ -1554,4 +1594,15 @@ namespace ts {
1554
1594
context . requestEmitHelper ( classPrivateFieldGetHelper ) ;
1555
1595
return createCall ( getHelperName ( "_classPrivateFieldGet" ) , /* typeArguments */ undefined , [ receiver , privateField ] ) ;
1556
1596
}
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
+ }
1557
1608
}
0 commit comments