Skip to content

Commit a4f2666

Browse files
authored
Fix nested destructuring in for-loop initialization with multi-return (#1318)
* Fix nested destructuring in for-loop initialization in multi-return * Fix tests
1 parent bd3bced commit a4f2666

File tree

3 files changed

+36
-16
lines changed

3 files changed

+36
-16
lines changed

src/transformation/visitors/language-extensions/iterable.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ function transformForOfMultiIterableStatement(
1717
luaIterator: lua.Expression,
1818
invalidMultiUseDiagnostic: (node: ts.Node) => ts.Diagnostic
1919
): lua.Statement {
20+
context.pushPrecedingStatements();
2021
let identifiers: lua.Identifier[] = [];
2122

2223
if (ts.isVariableDeclarationList(statement.initializer)) {
@@ -51,6 +52,8 @@ function transformForOfMultiIterableStatement(
5152
identifiers.push(lua.createAnonymousIdentifier());
5253
}
5354

55+
block.statements.unshift(...context.popPrecedingStatements());
56+
5457
return lua.createForInStatement(block, identifiers, [luaIterator], statement);
5558
}
5659

test/unit/language-extensions/__snapshots__/iterable.spec.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ exports[`LuaIterable with LuaMultiReturn value type invalid LuaIterable<LuaMulti
44
"local ____exports = {}
55
function ____exports.__main(self)
66
local function testIterable()
7-
local strsArray = {{\\"a1\\", \\"a2\\"}, {\\"b1\\", \\"b2\\"}, {\\"c1\\", \\"c2\\"}}
7+
local strsArray = {{\\"a1\\", {a = \\"a\\"}}, {\\"b1\\", {a = \\"b\\"}}, {\\"c1\\", {a = \\"c\\"}}}
88
local i = 0
99
return function()
1010
local ____i_0 = i
@@ -27,7 +27,7 @@ exports[`LuaIterable with LuaMultiReturn value type invalid LuaIterable<LuaMulti
2727
"local ____exports = {}
2828
function ____exports.__main(self)
2929
local function testIterable()
30-
local strsArray = {{\\"a1\\", \\"a2\\"}, {\\"b1\\", \\"b2\\"}, {\\"c1\\", \\"c2\\"}}
30+
local strsArray = {{\\"a1\\", {a = \\"a\\"}}, {\\"b1\\", {a = \\"b\\"}}, {\\"c1\\", {a = \\"c\\"}}}
3131
local i = 0
3232
return function()
3333
local ____i_0 = i

test/unit/language-extensions/iterable.spec.ts

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ describe("LuaIterable with array value type", () => {
239239
test("basic destructuring", () => {
240240
util.testFunction`
241241
${testIterable}
242-
const results: Array<string[]> = [];
242+
const results = [];
243243
for (const [x, y] of testIterable()) {
244244
results.push([x, y]);
245245
}
@@ -252,7 +252,7 @@ describe("LuaIterable with array value type", () => {
252252
test("destructure with external control variable", () => {
253253
util.testFunction`
254254
${testIterable}
255-
const results: Array<string[]> = [];
255+
const results = []
256256
let x: string, y: string;
257257
for ([x, y] of testIterable()) {
258258
results.push([x, y]);
@@ -326,8 +326,8 @@ describe("LuaIterable with array value type", () => {
326326

327327
describe("LuaIterable with LuaMultiReturn value type", () => {
328328
const testIterable = `
329-
function testIterable(this: void): LuaIterable<LuaMultiReturn<string[]>> {
330-
const strsArray = [["a1", "a2"], ["b1", "b2"], ["c1", "c2"]];
329+
function testIterable(this: void): LuaIterable<LuaMultiReturn<[string, {a: string}]>> {
330+
const strsArray = [["a1", {a: "a"}], ["b1", {a: "b"}], ["c1", {a: "c"}]];
331331
let i = 0;
332332
return (() => {
333333
const strs = strsArray[i++];
@@ -338,15 +338,15 @@ describe("LuaIterable with LuaMultiReturn value type", () => {
338338
}
339339
`;
340340
const testResults = [
341-
["a1", "a2"],
342-
["b1", "b2"],
343-
["c1", "c2"],
341+
["a1", { a: "a" }],
342+
["b1", { a: "b" }],
343+
["c1", { a: "c" }],
344344
];
345345

346346
test("basic destructuring", () => {
347347
util.testFunction`
348348
${testIterable}
349-
const results: Array<string[]> = [];
349+
const results = [];
350350
for (const [x, y] of testIterable()) {
351351
results.push([x, y]);
352352
}
@@ -359,8 +359,8 @@ describe("LuaIterable with LuaMultiReturn value type", () => {
359359
test("destructure with external control variable", () => {
360360
util.testFunction`
361361
${testIterable}
362-
const results: Array<string[]> = [];
363-
let x: string, y: string;
362+
const results = [];
363+
let x: string, y: any;
364364
for ([x, y] of testIterable()) {
365365
results.push([x, y]);
366366
}
@@ -374,7 +374,7 @@ describe("LuaIterable with LuaMultiReturn value type", () => {
374374
util.testFunction`
375375
${testIterable}
376376
function forward() { return testIterable(); }
377-
const results: Array<string[]> = [];
377+
const results = [];
378378
for (const [x, y] of forward()) {
379379
results.push([x, y]);
380380
}
@@ -388,7 +388,7 @@ describe("LuaIterable with LuaMultiReturn value type", () => {
388388
util.testFunction`
389389
${testIterable}
390390
function forward() { const iter = testIterable(); return iter; }
391-
const results: Array<string[]> = [];
391+
const results = [];
392392
for (const [x, y] of forward()) {
393393
results.push([x, y]);
394394
}
@@ -402,7 +402,7 @@ describe("LuaIterable with LuaMultiReturn value type", () => {
402402
util.testFunction`
403403
${testIterable}
404404
const forward = () => testIterable();
405-
const results: Array<string[]> = [];
405+
const results = [];
406406
for (const [x, y] of forward()) {
407407
results.push([x, y]);
408408
}
@@ -415,7 +415,7 @@ describe("LuaIterable with LuaMultiReturn value type", () => {
415415
test("destructure manual use", () => {
416416
util.testFunction`
417417
${testIterable}
418-
const results: Array<string[]> = [];
418+
const results = [];
419419
const iter = testIterable();
420420
while (true) {
421421
const [x, y] = iter();
@@ -430,6 +430,23 @@ describe("LuaIterable with LuaMultiReturn value type", () => {
430430
.expectToEqual(testResults);
431431
});
432432

433+
test("nested destructuring", () => {
434+
util.testFunction`
435+
${testIterable}
436+
const results = [];
437+
for (const [x, {a}] of testIterable()) {
438+
results.push([x, a]);
439+
}
440+
return results;
441+
`
442+
.withLanguageExtensions()
443+
.expectToEqual([
444+
["a1", "a"],
445+
["b1", "b"],
446+
["c1", "c"],
447+
]);
448+
});
449+
433450
test.each(["for (const s of testIterable()) {}", "let s; for (s of testIterable()) {}"])(
434451
"invalid LuaIterable<LuaMultiReturn> without destructuring (%p)",
435452
statement => {

0 commit comments

Comments
 (0)