11import * as ts from "typescript" ;
22import * as lua from "../../../LuaAST" ;
3- import { cast , castEach } from "../../../utils" ;
3+ import { castEach } from "../../../utils" ;
44import { FunctionVisitor , TransformationContext } from "../../context" ;
55import { AnnotationKind , getTypeAnnotations , isForRangeType , isLuaIteratorType } from "../../utils/annotations" ;
6- import {
7- InvalidForRangeCall ,
8- MissingForOfVariables ,
9- UnsupportedNonDestructuringLuaIterator ,
10- UnsupportedObjectDestructuringInForOf ,
11- } from "../../utils/errors" ;
12- import { createUnpackCall } from "../../utils/lua-ast" ;
6+ import { InvalidForRangeCall , MissingForOfVariables , UnsupportedNonDestructuringLuaIterator } from "../../utils/errors" ;
137import { LuaLibFeature , transformLuaLibFunction } from "../../utils/lualib" ;
14- import { isArrayType , isNumberType } from "../../utils/typescript" ;
8+ import { isArrayType , isNumberType , isAssignmentPattern } from "../../utils/typescript" ;
159import { transformArguments } from "../call" ;
1610import { transformIdentifier } from "../identifier" ;
1711import {
@@ -20,6 +14,8 @@ import {
2014 transformVariableDeclaration ,
2115} from "../variable-declaration" ;
2216import { getVariableDeclarationBinding , transformLoopBody } from "./utils" ;
17+ import { transformAssignment } from "../binary-expression/assignments" ;
18+ import { transformAssignmentPattern } from "../binary-expression/destructuring-assignments" ;
2319
2420function transformForOfInitializer (
2521 context : TransformationContext ,
@@ -29,15 +25,8 @@ function transformForOfInitializer(
2925 if ( ts . isVariableDeclarationList ( initializer ) ) {
3026 const binding = getVariableDeclarationBinding ( initializer ) ;
3127 // Declaration of new variable
32- if ( ts . isArrayBindingPattern ( binding ) ) {
33- if ( binding . elements . length === 0 ) {
34- // Ignore empty destructuring assignment
35- return [ ] ;
36- }
37-
28+ if ( ts . isArrayBindingPattern ( binding ) || ts . isObjectBindingPattern ( binding ) ) {
3829 return transformBindingPattern ( context , binding , expression ) ;
39- } else if ( ts . isObjectBindingPattern ( binding ) ) {
40- throw UnsupportedObjectDestructuringInForOf ( initializer ) ;
4130 }
4231
4332 const variableStatements = transformVariableDeclaration ( context , initializer . declarations [ 0 ] ) ;
@@ -53,27 +42,13 @@ function transformForOfInitializer(
5342 throw MissingForOfVariables ( initializer ) ;
5443 }
5544 } else {
56- // Assignment to existing variable
57- let variables : lua . AssignmentLeftHandSideExpression | lua . AssignmentLeftHandSideExpression [ ] ;
58- let valueExpression : lua . Expression = expression ;
59- if ( ts . isArrayLiteralExpression ( initializer ) ) {
60- if ( initializer . elements . length > 0 ) {
61- valueExpression = createUnpackCall ( context , expression , initializer ) ;
62- variables = castEach (
63- initializer . elements . map ( e => context . transformExpression ( e ) ) ,
64- lua . isAssignmentLeftHandSideExpression
65- ) ;
66- } else {
67- // Ignore empty destructring assignment
68- return [ ] ;
69- }
70- } else if ( ts . isObjectLiteralExpression ( initializer ) ) {
71- throw UnsupportedObjectDestructuringInForOf ( initializer ) ;
72- } else {
73- variables = cast ( context . transformExpression ( initializer ) , lua . isAssignmentLeftHandSideExpression ) ;
45+ // Assignment to existing variable(s)
46+
47+ if ( isAssignmentPattern ( initializer ) ) {
48+ return transformAssignmentPattern ( context , initializer , expression ) ;
7449 }
7550
76- return [ lua . createAssignmentStatement ( variables , valueExpression ) ] ;
51+ return transformAssignment ( context , initializer , expression ) ;
7752 }
7853}
7954
0 commit comments