@@ -33,7 +33,22 @@ export function parseAccessExpressionWithEvaluationEffects(
3333 return [ ] ;
3434}
3535
36- const compoundToAssignmentTokens : Record < ts . CompoundAssignmentOperator , ts . BinaryOperator > = {
36+ // TODO: `as const` doesn't work on enum members
37+ type CompoundAssignmentToken =
38+ | ts . SyntaxKind . BarToken
39+ | ts . SyntaxKind . PlusToken
40+ | ts . SyntaxKind . CaretToken
41+ | ts . SyntaxKind . MinusToken
42+ | ts . SyntaxKind . SlashToken
43+ | ts . SyntaxKind . PercentToken
44+ | ts . SyntaxKind . AsteriskToken
45+ | ts . SyntaxKind . AmpersandToken
46+ | ts . SyntaxKind . AsteriskAsteriskToken
47+ | ts . SyntaxKind . LessThanLessThanToken
48+ | ts . SyntaxKind . GreaterThanGreaterThanToken
49+ | ts . SyntaxKind . GreaterThanGreaterThanGreaterThanToken ;
50+
51+ const compoundToAssignmentTokens : Record < ts . CompoundAssignmentOperator , CompoundAssignmentToken > = {
3752 [ ts . SyntaxKind . BarEqualsToken ] : ts . SyntaxKind . BarToken ,
3853 [ ts . SyntaxKind . PlusEqualsToken ] : ts . SyntaxKind . PlusToken ,
3954 [ ts . SyntaxKind . CaretEqualsToken ] : ts . SyntaxKind . CaretToken ,
@@ -51,7 +66,7 @@ const compoundToAssignmentTokens: Record<ts.CompoundAssignmentOperator, ts.Binar
5166export const isCompoundAssignmentToken = ( token : ts . BinaryOperator ) : token is ts . CompoundAssignmentOperator =>
5267 token in compoundToAssignmentTokens ;
5368
54- export const unwrapCompoundAssignmentToken = ( token : ts . CompoundAssignmentOperator ) =>
69+ export const unwrapCompoundAssignmentToken = ( token : ts . CompoundAssignmentOperator ) : CompoundAssignmentToken =>
5570 compoundToAssignmentTokens [ token ] ;
5671
5772export function transformCompoundAssignmentExpression (
@@ -60,7 +75,7 @@ export function transformCompoundAssignmentExpression(
6075 // TODO: Change type to ts.LeftHandSideExpression?
6176 lhs : ts . Expression ,
6277 rhs : ts . Expression ,
63- replacementOperator : ts . BinaryOperator ,
78+ operator : CompoundAssignmentToken ,
6479 isPostfix : boolean
6580) : lua . CallExpression {
6681 const left = cast ( context . transformExpression ( lhs ) , lua . isAssignmentLeftHandSideExpression ) ;
@@ -86,7 +101,7 @@ export function transformCompoundAssignmentExpression(
86101 // local ____tmp = ____obj[____index];
87102 // ____obj[____index] = ____tmp ${replacementOperator} ${right};
88103 tmpDeclaration = lua . createVariableDeclarationStatement ( tmp , accessExpression ) ;
89- const operatorExpression = transformBinaryOperation ( context , tmp , right , replacementOperator , expression ) ;
104+ const operatorExpression = transformBinaryOperation ( context , tmp , right , operator , expression ) ;
90105 assignStatement = lua . createAssignmentStatement ( accessExpression , operatorExpression ) ;
91106 } else {
92107 // local ____tmp = ____obj[____index] ${replacementOperator} ${right};
@@ -95,7 +110,7 @@ export function transformCompoundAssignmentExpression(
95110 context ,
96111 accessExpression ,
97112 right ,
98- replacementOperator ,
113+ operator ,
99114 expression
100115 ) ;
101116 tmpDeclaration = lua . createVariableDeclarationStatement ( tmp , operatorExpression ) ;
@@ -118,7 +133,7 @@ export function transformCompoundAssignmentExpression(
118133 context ,
119134 tmpIdentifier ,
120135 right ,
121- replacementOperator ,
136+ operator ,
122137 expression
123138 ) ;
124139 const assignStatement = transformAssignment ( context , lhs , operatorExpression ) ;
@@ -129,14 +144,14 @@ export function transformCompoundAssignmentExpression(
129144 // ${left} = ____tmp;
130145 // return ____tmp
131146 const tmpIdentifier = lua . createIdentifier ( "____tmp" ) ;
132- const operatorExpression = transformBinaryOperation ( context , left , right , replacementOperator , expression ) ;
147+ const operatorExpression = transformBinaryOperation ( context , left , right , operator , expression ) ;
133148 const tmpDeclaration = lua . createVariableDeclarationStatement ( tmpIdentifier , operatorExpression ) ;
134149 const assignStatement = transformAssignment ( context , lhs , tmpIdentifier ) ;
135150 return createImmediatelyInvokedFunctionExpression ( [ tmpDeclaration , assignStatement ] , tmpIdentifier , expression ) ;
136151 } else {
137152 // Simple expressions
138153 // ${left} = ${right}; return ${right}
139- const operatorExpression = transformBinaryOperation ( context , left , right , replacementOperator , expression ) ;
154+ const operatorExpression = transformBinaryOperation ( context , left , right , operator , expression ) ;
140155 const assignStatement = transformAssignment ( context , lhs , operatorExpression ) ;
141156 return createImmediatelyInvokedFunctionExpression ( [ assignStatement ] , left , expression ) ;
142157 }
@@ -147,7 +162,7 @@ export function transformCompoundAssignmentStatement(
147162 node : ts . Node ,
148163 lhs : ts . Expression ,
149164 rhs : ts . Expression ,
150- replacementOperator : ts . BinaryOperator
165+ operator : CompoundAssignmentToken
151166) : lua . Statement {
152167 const left = cast ( context . transformExpression ( lhs ) , lua . isAssignmentLeftHandSideExpression ) ;
153168 const right = context . transformExpression ( rhs ) ;
@@ -168,15 +183,15 @@ export function transformCompoundAssignmentStatement(
168183 context ,
169184 accessExpression ,
170185 lua . createParenthesizedExpression ( right ) ,
171- replacementOperator ,
186+ operator ,
172187 node
173188 ) ;
174189 const assignStatement = lua . createAssignmentStatement ( accessExpression , operatorExpression ) ;
175190 return lua . createDoStatement ( [ objAndIndexDeclaration , assignStatement ] ) ;
176191 } else {
177192 // Simple statements
178193 // ${left} = ${left} ${replacementOperator} ${right}
179- const operatorExpression = transformBinaryOperation ( context , left , right , replacementOperator , node ) ;
194+ const operatorExpression = transformBinaryOperation ( context , left , right , operator , node ) ;
180195 return transformAssignment ( context , lhs , operatorExpression ) ;
181196 }
182197}
0 commit comments