@@ -964,7 +964,10 @@ export class LuaTransformer {
964964 ) ] ;
965965 } else {
966966 // local vars = this.transpileDestructingAssignmentValue(node.initializer);
967- const initializer = this . createUnpackCall ( this . transformExpression ( statement . initializer ) ) ;
967+ const initializer = this . createUnpackCall (
968+ this . transformExpression ( statement . initializer ) ,
969+ statement . initializer
970+ ) ;
968971 return [ tstl . createVariableDeclarationStatement ( vars , initializer ) ] ;
969972 }
970973 } else {
@@ -1058,7 +1061,10 @@ export class LuaTransformer {
10581061 . map ( elem => this . transformExpression ( elem ) ) ) ;
10591062 } else if ( ! tsHelper . isTupleReturnCall ( statement . expression , this . checker ) ) {
10601063 // If return expression is not another TupleReturn call, unpack it
1061- const expression = this . createUnpackCall ( this . transformExpression ( statement . expression ) ) ;
1064+ const expression = this . createUnpackCall (
1065+ this . transformExpression ( statement . expression ) ,
1066+ statement . expression
1067+ ) ;
10621068 return tstl . createReturnStatement ( [ expression ] ) ;
10631069 }
10641070 }
@@ -1133,15 +1139,15 @@ export class LuaTransformer {
11331139 // Declaration of new variable
11341140 const variableDeclarations = this . transformVariableDeclaration ( initializer . declarations [ 0 ] ) ;
11351141 if ( ts . isArrayBindingPattern ( initializer . declarations [ 0 ] . name ) ) {
1136- expression = this . createUnpackCall ( expression ) ;
1142+ expression = this . createUnpackCall ( expression , initializer ) ;
11371143 }
11381144 return tstl . createVariableDeclarationStatement ( variableDeclarations [ 0 ] . left , expression ) ;
11391145
11401146 } else {
11411147 // Assignment to existing variable
11421148 let variables : tstl . IdentifierOrTableIndexExpression | tstl . IdentifierOrTableIndexExpression [ ] ;
11431149 if ( ts . isArrayLiteralExpression ( initializer ) ) {
1144- expression = this . createUnpackCall ( expression ) ;
1150+ expression = this . createUnpackCall ( expression , initializer ) ;
11451151 variables = initializer . elements
11461152 . map ( e => this . transformExpression ( e ) ) as tstl . IdentifierOrTableIndexExpression [ ] ;
11471153 } else {
@@ -1483,7 +1489,7 @@ export class LuaTransformer {
14831489 case ts . SyntaxKind . TypeOfExpression :
14841490 return this . transformTypeOfExpression ( expression as ts . TypeOfExpression ) ;
14851491 case ts . SyntaxKind . SpreadElement :
1486- throw new Error ( "Not yet implemented" ) ;
1492+ return this . transformSpreadElement ( expression as ts . SpreadElement ) ;
14871493 case ts . SyntaxKind . NonNullExpression :
14881494 return this . transformExpression ( ( expression as ts . NonNullExpression ) . expression ) ;
14891495 case ts . SyntaxKind . EmptyStatement :
@@ -1635,7 +1641,7 @@ export class LuaTransformer {
16351641 } else if ( tsHelper . isTupleReturnCall ( expression . right , this . checker ) ) {
16361642 right = [ this . transformExpression ( expression . right ) ] ;
16371643 } else {
1638- right = [ this . createUnpackCall ( this . transformExpression ( expression . right ) ) ] ;
1644+ right = [ this . createUnpackCall ( this . transformExpression ( expression . right ) , expression . right ) ] ;
16391645 }
16401646 return tstl . createAssignmentStatement (
16411647 left as tstl . IdentifierOrTableIndexExpression [ ] ,
@@ -1667,7 +1673,7 @@ export class LuaTransformer {
16671673 } else if ( tsHelper . isTupleReturnCall ( expression . right , this . checker ) ) {
16681674 right = [ this . transformExpression ( expression . right ) ] ;
16691675 } else {
1670- right = [ this . createUnpackCall ( this . transformExpression ( expression . right ) ) ] ;
1676+ right = [ this . createUnpackCall ( this . transformExpression ( expression . right ) , expression . right ) ] ;
16711677 }
16721678 const tmps = expression . left . elements . map ( ( _ , i ) => tstl . createIdentifier ( `____TS_tmp${ i } ` ) ) ;
16731679 const statements : tstl . Statement [ ] = [
@@ -2765,6 +2771,12 @@ export class LuaTransformer {
27652771 ) ;
27662772 }
27672773
2774+ public transformSpreadElement ( expression : ts . SpreadElement ) : ExpressionVisitResult {
2775+ const innerExpression = this . transformExpression ( expression . expression ) ;
2776+
2777+ return this . createUnpackCall ( innerExpression , expression ) ;
2778+ }
2779+
27682780 public transformStringLiteral ( literal : ts . StringLiteralLike ) : tstl . StringLiteral {
27692781 const text = this . escapeString ( literal . text ) ;
27702782 return tstl . createStringLiteral ( text ) ;
@@ -2888,18 +2900,20 @@ export class LuaTransformer {
28882900 return tstl . createCallExpression ( tstl . createParenthesizedExpression ( iife ) , [ ] , undefined , tsOriginal ) ;
28892901 }
28902902
2891- public createUnpackCall ( expression : tstl . Expression ) : tstl . Expression {
2903+ public createUnpackCall ( expression : tstl . Expression , tsOriginal : ts . Node ) : tstl . Expression {
28922904 switch ( this . options . luaTarget ) {
28932905 case LuaTarget . Lua51 :
28942906 case LuaTarget . LuaJIT :
2895- return tstl . createCallExpression ( tstl . createIdentifier ( "unpack" ) , [ expression ] ) ;
2907+ return tstl . createCallExpression ( tstl . createIdentifier ( "unpack" ) , [ expression ] , undefined , tsOriginal ) ;
28962908
28972909 case LuaTarget . Lua52 :
28982910 case LuaTarget . Lua53 :
28992911 default :
29002912 return tstl . createCallExpression (
29012913 tstl . createTableIndexExpression ( tstl . createIdentifier ( "table" ) , tstl . createStringLiteral ( "unpack" ) ) ,
2902- [ expression ]
2914+ [ expression ] ,
2915+ undefined ,
2916+ tsOriginal
29032917 ) ;
29042918 }
29052919 }
0 commit comments