Skip to content

Commit 247ceba

Browse files
hazzard993Perryvw
authored andcommitted
false default binding pattern values (#538)
* false default binding pattern values * Tidied up tests * Added array binding pattern default test * Array binding pattern default parameters
1 parent a980e13 commit 247ceba

File tree

2 files changed

+80
-15
lines changed

2 files changed

+80
-15
lines changed

src/LuaTransformer.ts

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

test/unit/bindingpatterns.spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,22 @@ test.each(testCases)(
9090
expect(result).toBe(true);
9191
},
9292
);
93+
94+
test.each([
95+
{ bindingString: "{x, y = true}", objectString: "{x: false, y: false}", returnVariable: "y" },
96+
{
97+
bindingString: "{x, y: [z = true]}",
98+
objectString: "{x: false, y: [false]}",
99+
returnVariable: "z",
100+
},
101+
{ bindingString: "[x = true]", objectString: "[false]", returnVariable: "x" },
102+
])(
103+
"Binding patterns handle false correctly (%p)",
104+
({ bindingString, objectString, returnVariable }) => {
105+
const result = util.transpileExecuteAndReturnExport(
106+
`export const ${bindingString} = ${objectString};`,
107+
returnVariable,
108+
);
109+
expect(result).toBe(false);
110+
},
111+
);

0 commit comments

Comments
 (0)