From 8c443a8a2ec43c43bfec568ae0ff6a53573118e6 Mon Sep 17 00:00:00 2001 From: Martin Jesper Low Madsen Date: Tue, 23 Jul 2019 20:22:42 +0200 Subject: [PATCH] Support omitted declarations for destructured tuples --- src/LuaTransformer.ts | 12 ++++++++++-- src/TSHelper.ts | 8 +++++++- test/unit/tuples.spec.ts | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index 4138f2af2..73deba20a 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -1943,7 +1943,9 @@ export class LuaTransformer { // For nested bindings and object bindings, fall back to transformBindingPattern if ( ts.isObjectBindingPattern(statement.name) || - statement.name.elements.some(elem => !ts.isBindingElement(elem) || !ts.isIdentifier(elem.name)) + statement.name.elements.some( + elem => (!ts.isBindingElement(elem) || !ts.isIdentifier(elem.name)) && !ts.isOmittedExpression(elem) + ) ) { const statements = []; let table: tstl.Identifier; @@ -1968,7 +1970,13 @@ export class LuaTransformer { } // Disallow ellipsis destruction - if (statement.name.elements.some(elem => !ts.isBindingElement(elem) || elem.dotDotDotToken !== undefined)) { + if ( + statement.name.elements.some( + elem => + (!ts.isBindingElement(elem) || elem.dotDotDotToken !== undefined) && + !ts.isOmittedExpression(elem) + ) + ) { throw TSTLErrors.ForbiddenEllipsisDestruction(statement); } diff --git a/src/TSHelper.ts b/src/TSHelper.ts index 13ff34e5a..c6dafd21f 100644 --- a/src/TSHelper.ts +++ b/src/TSHelper.ts @@ -832,8 +832,14 @@ export function isWithinLiteralAssignmentStatement(node: ts.Node): boolean { if (!node.parent) { return false; } - if (ts.isArrayLiteralExpression(node.parent) || ts.isObjectLiteralExpression(node.parent)) { + if ( + ts.isArrayLiteralExpression(node.parent) || + ts.isArrayBindingPattern(node.parent) || + ts.isObjectLiteralExpression(node.parent) + ) { return isWithinLiteralAssignmentStatement(node.parent); + } else if (isInDestructingAssignment(node)) { + return true; } else if (ts.isBinaryExpression(node.parent) && node.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken) { return true; } else { diff --git a/test/unit/tuples.spec.ts b/test/unit/tuples.spec.ts index 4f527f29f..779bd8666 100644 --- a/test/unit/tuples.spec.ts +++ b/test/unit/tuples.spec.ts @@ -122,7 +122,7 @@ test("Tuple Return Destruct Declaration", () => { const code = ` /** @tupleReturn */ function tuple(): [number, number, number] { return [3,5,1]; } - const [a,b,c] = tuple(); + const [,b,c] = tuple(); return b;`; const lua = util.transpileString(code);