@@ -762,6 +762,46 @@ namespace ts {
762
762
visitNode ( node . right , noDestructuringValue ? visitorNoDestructuringValue : visitor , isExpression )
763
763
) ;
764
764
}
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
+ }
765
805
return visitEachChild ( node , visitor , context ) ;
766
806
}
767
807
@@ -1599,4 +1639,15 @@ namespace ts {
1599
1639
context . requestEmitHelper ( classPrivateFieldGetHelper ) ;
1600
1640
return createCall ( getHelperName ( "_classPrivateFieldGet" ) , /* typeArguments */ undefined , [ receiver , privateField ] ) ;
1601
1641
}
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
+ }
1602
1653
}
0 commit comments