11import * as ts from "typescript" ;
22import * as lua from "../../../LuaAST" ;
3- import { cast , castEach } from "../../../utils" ;
43import { TransformationContext } from "../../context" ;
54import { isTupleReturnCall } from "../../utils/annotations" ;
65import { validateAssignment , validatePropertyAssignment } from "../../utils/assignment-validation" ;
6+ import { createExportedIdentifier , isSymbolExported } from "../../utils/export" ;
77import { createImmediatelyInvokedFunctionExpression , createUnpackCall , wrapInTable } from "../../utils/lua-ast" ;
88import { LuaLibFeature , transformLuaLibFunction } from "../../utils/lualib" ;
99import { isArrayType , isDestructuringAssignment } from "../../utils/typescript" ;
1010import { transformElementAccessArgument } from "../access" ;
1111import { isArrayLength , transformDestructuringAssignment } from "./destructuring-assignments" ;
1212
13+ export function transformAssignmentLeftHandSideExpression (
14+ context : TransformationContext ,
15+ node : ts . Expression
16+ ) : lua . AssignmentLeftHandSideExpression {
17+ const symbol = context . checker . getSymbolAtLocation ( node ) ;
18+ const left = context . transformExpression ( node ) ;
19+
20+ return lua . isIdentifier ( left ) && symbol && isSymbolExported ( context , symbol )
21+ ? createExportedIdentifier ( context , left )
22+ : ( left as lua . AssignmentLeftHandSideExpression ) ;
23+ }
24+
1325export function transformAssignment (
1426 context : TransformationContext ,
1527 // TODO: Change type to ts.LeftHandSideExpression?
@@ -29,11 +41,7 @@ export function transformAssignment(
2941 ) ;
3042 }
3143
32- return lua . createAssignmentStatement (
33- cast ( context . transformExpression ( lhs ) , lua . isAssignmentLeftHandSideExpression ) ,
34- right ,
35- lhs . parent
36- ) ;
44+ return lua . createAssignmentStatement ( transformAssignmentLeftHandSideExpression ( context , lhs ) , right , lhs . parent ) ;
3745}
3846
3947export function transformAssignmentExpression (
@@ -139,10 +147,7 @@ export function transformAssignmentStatement(
139147 right = createUnpackCall ( context , right , expression . right ) ;
140148 }
141149
142- const left = castEach (
143- expression . left . elements . map ( e => context . transformExpression ( e ) ) ,
144- lua . isAssignmentLeftHandSideExpression
145- ) ;
150+ const left = expression . left . elements . map ( e => transformAssignmentLeftHandSideExpression ( context , e ) ) ;
146151
147152 return [ lua . createAssignmentStatement ( left , right , expression ) ] ;
148153 }
0 commit comments