@@ -1370,14 +1370,26 @@ export class LuaTransformer {
13701370 const expression = isObjectBindingPattern
13711371 ? tstl . createTableIndexExpression ( tableExpression , tstl . createStringLiteral ( propertyName . text ) )
13721372 : tstl . createTableIndexExpression ( tableExpression , tstl . createNumericLiteral ( index + 1 ) ) ;
1373+ yield * this . createLocalOrExportedOrGlobalDeclaration ( variableName , expression ) ;
13731374 if ( element . initializer ) {
1374- const defaultExpression = tstl . createBinaryExpression ( expression ,
1375- this . expectExpression ( this . transformExpression ( element . initializer ) ) ,
1376- tstl . SyntaxKind . OrOperator
1375+ const identifier = this . shouldExportIdentifier ( variableName )
1376+ ? this . createExportedIdentifier ( variableName )
1377+ : variableName ;
1378+ yield tstl . createIfStatement (
1379+ tstl . createBinaryExpression (
1380+ identifier ,
1381+ tstl . createNilLiteral ( ) ,
1382+ tstl . SyntaxKind . EqualityOperator
1383+ ) ,
1384+ tstl . createBlock (
1385+ [
1386+ tstl . createAssignmentStatement (
1387+ identifier ,
1388+ this . transformExpression ( element . initializer )
1389+ ) ,
1390+ ]
1391+ )
13771392 ) ;
1378- yield * this . createLocalOrExportedOrGlobalDeclaration ( variableName , defaultExpression ) ;
1379- } else {
1380- yield * this . createLocalOrExportedOrGlobalDeclaration ( variableName , expression ) ;
13811393 }
13821394 }
13831395 }
@@ -1802,6 +1814,8 @@ export class LuaTransformer {
18021814 } else if ( ts . isArrayBindingPattern ( statement . name ) || ts . isObjectBindingPattern ( statement . name ) ) {
18031815 // Destructuring types
18041816
1817+ const statements : tstl . Statement [ ] = [ ] ;
1818+
18051819 // For nested bindings and object bindings, fall back to transformBindingPattern
18061820 if ( ts . isObjectBindingPattern ( statement . name )
18071821 || statement . name . elements . some ( elem => ! ts . isBindingElement ( elem ) || ! ts . isIdentifier ( elem . name ) ) ) {
@@ -1835,26 +1849,58 @@ export class LuaTransformer {
18351849 // Don't unpack TupleReturn decorated functions
18361850 if ( statement . initializer ) {
18371851 if ( tsHelper . isTupleReturnCall ( statement . initializer , this . checker ) ) {
1838- return this . createLocalOrExportedOrGlobalDeclaration (
1839- vars ,
1840- this . transformExpression ( statement . initializer ) ,
1841- statement
1852+ statements . push (
1853+ ...this . createLocalOrExportedOrGlobalDeclaration (
1854+ vars ,
1855+ this . transformExpression ( statement . initializer ) ,
1856+ statement
1857+ )
18421858 ) ;
18431859 } else {
18441860 // local vars = this.transpileDestructingAssignmentValue(node.initializer);
18451861 const initializer = this . createUnpackCall (
18461862 this . expectExpression ( this . transformExpression ( statement . initializer ) ) ,
18471863 statement . initializer
18481864 ) ;
1849- return this . createLocalOrExportedOrGlobalDeclaration ( vars , initializer , statement ) ;
1865+ statements . push ( ... this . createLocalOrExportedOrGlobalDeclaration ( vars , initializer , statement ) ) ;
18501866 }
18511867 } else {
1852- return this . createLocalOrExportedOrGlobalDeclaration (
1853- vars ,
1854- tstl . createNilLiteral ( ) ,
1855- statement
1868+ statements . push (
1869+ ...this . createLocalOrExportedOrGlobalDeclaration (
1870+ vars ,
1871+ tstl . createNilLiteral ( ) ,
1872+ statement
1873+ )
18561874 ) ;
18571875 }
1876+
1877+ statement . name . elements . forEach ( element => {
1878+ if ( ! ts . isOmittedExpression ( element ) && element . initializer ) {
1879+ const variableName = this . transformIdentifier ( element . name as ts . Identifier ) ;
1880+ const identifier = this . shouldExportIdentifier ( variableName )
1881+ ? this . createExportedIdentifier ( variableName )
1882+ : variableName ;
1883+ statements . push (
1884+ tstl . createIfStatement (
1885+ tstl . createBinaryExpression (
1886+ identifier ,
1887+ tstl . createNilLiteral ( ) ,
1888+ tstl . SyntaxKind . EqualityOperator
1889+ ) ,
1890+ tstl . createBlock (
1891+ [
1892+ tstl . createAssignmentStatement (
1893+ identifier ,
1894+ this . transformExpression ( element . initializer )
1895+ ) ,
1896+ ]
1897+ )
1898+ )
1899+ ) ;
1900+ }
1901+ } ) ;
1902+
1903+ return statements ;
18581904 }
18591905 }
18601906
0 commit comments