diff --git a/src/transformation/visitors/language-extensions/iterable.ts b/src/transformation/visitors/language-extensions/iterable.ts index dc792df6d..5d96f409e 100644 --- a/src/transformation/visitors/language-extensions/iterable.ts +++ b/src/transformation/visitors/language-extensions/iterable.ts @@ -17,6 +17,7 @@ function transformForOfMultiIterableStatement( luaIterator: lua.Expression, invalidMultiUseDiagnostic: (node: ts.Node) => ts.Diagnostic ): lua.Statement { + context.pushPrecedingStatements(); let identifiers: lua.Identifier[] = []; if (ts.isVariableDeclarationList(statement.initializer)) { @@ -51,6 +52,8 @@ function transformForOfMultiIterableStatement( identifiers.push(lua.createAnonymousIdentifier()); } + block.statements.unshift(...context.popPrecedingStatements()); + return lua.createForInStatement(block, identifiers, [luaIterator], statement); } diff --git a/test/unit/language-extensions/__snapshots__/iterable.spec.ts.snap b/test/unit/language-extensions/__snapshots__/iterable.spec.ts.snap index d866c5e31..8e1601a39 100644 --- a/test/unit/language-extensions/__snapshots__/iterable.spec.ts.snap +++ b/test/unit/language-extensions/__snapshots__/iterable.spec.ts.snap @@ -4,7 +4,7 @@ exports[`LuaIterable with LuaMultiReturn value type invalid LuaIterable { test("basic destructuring", () => { util.testFunction` ${testIterable} - const results: Array = []; + const results = []; for (const [x, y] of testIterable()) { results.push([x, y]); } @@ -252,7 +252,7 @@ describe("LuaIterable with array value type", () => { test("destructure with external control variable", () => { util.testFunction` ${testIterable} - const results: Array = []; + const results = [] let x: string, y: string; for ([x, y] of testIterable()) { results.push([x, y]); @@ -326,8 +326,8 @@ describe("LuaIterable with array value type", () => { describe("LuaIterable with LuaMultiReturn value type", () => { const testIterable = ` - function testIterable(this: void): LuaIterable> { - const strsArray = [["a1", "a2"], ["b1", "b2"], ["c1", "c2"]]; + function testIterable(this: void): LuaIterable> { + const strsArray = [["a1", {a: "a"}], ["b1", {a: "b"}], ["c1", {a: "c"}]]; let i = 0; return (() => { const strs = strsArray[i++]; @@ -338,15 +338,15 @@ describe("LuaIterable with LuaMultiReturn value type", () => { } `; const testResults = [ - ["a1", "a2"], - ["b1", "b2"], - ["c1", "c2"], + ["a1", { a: "a" }], + ["b1", { a: "b" }], + ["c1", { a: "c" }], ]; test("basic destructuring", () => { util.testFunction` ${testIterable} - const results: Array = []; + const results = []; for (const [x, y] of testIterable()) { results.push([x, y]); } @@ -359,8 +359,8 @@ describe("LuaIterable with LuaMultiReturn value type", () => { test("destructure with external control variable", () => { util.testFunction` ${testIterable} - const results: Array = []; - let x: string, y: string; + const results = []; + let x: string, y: any; for ([x, y] of testIterable()) { results.push([x, y]); } @@ -374,7 +374,7 @@ describe("LuaIterable with LuaMultiReturn value type", () => { util.testFunction` ${testIterable} function forward() { return testIterable(); } - const results: Array = []; + const results = []; for (const [x, y] of forward()) { results.push([x, y]); } @@ -388,7 +388,7 @@ describe("LuaIterable with LuaMultiReturn value type", () => { util.testFunction` ${testIterable} function forward() { const iter = testIterable(); return iter; } - const results: Array = []; + const results = []; for (const [x, y] of forward()) { results.push([x, y]); } @@ -402,7 +402,7 @@ describe("LuaIterable with LuaMultiReturn value type", () => { util.testFunction` ${testIterable} const forward = () => testIterable(); - const results: Array = []; + const results = []; for (const [x, y] of forward()) { results.push([x, y]); } @@ -415,7 +415,7 @@ describe("LuaIterable with LuaMultiReturn value type", () => { test("destructure manual use", () => { util.testFunction` ${testIterable} - const results: Array = []; + const results = []; const iter = testIterable(); while (true) { const [x, y] = iter(); @@ -430,6 +430,23 @@ describe("LuaIterable with LuaMultiReturn value type", () => { .expectToEqual(testResults); }); + test("nested destructuring", () => { + util.testFunction` + ${testIterable} + const results = []; + for (const [x, {a}] of testIterable()) { + results.push([x, a]); + } + return results; + ` + .withLanguageExtensions() + .expectToEqual([ + ["a1", "a"], + ["b1", "b"], + ["c1", "c"], + ]); + }); + test.each(["for (const s of testIterable()) {}", "let s; for (s of testIterable()) {}"])( "invalid LuaIterable without destructuring (%p)", statement => {