X Tutup
Skip to content

Commit 43d8274

Browse files
authored
Fix LuaMultiReturn not being recognized inside more complicated iterables (#1595)
* Fix LuaMultiReturn not being recognized inside more complicated iterable types * Fix it in a way that doesn't break other stuff
1 parent ce0b8a7 commit 43d8274

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,13 @@ export function transformForOfIterableStatement(
6262
statement: ts.ForOfStatement,
6363
block: lua.Block
6464
): lua.Statement {
65-
const type = context.checker.getTypeAtLocation(statement.expression);
66-
if (type.aliasTypeArguments?.length === 2 && isMultiReturnType(type.aliasTypeArguments[0])) {
65+
const iteratedExpressionType = context.checker.getTypeAtLocation(statement.expression);
66+
const iterableType =
67+
iteratedExpressionType.isIntersection() &&
68+
iteratedExpressionType.types.find(t => t.symbol.escapedName === "Iterable");
69+
const iterableTypeArguments = (iterableType as ts.TypeReference)?.typeArguments;
70+
71+
if (iterableTypeArguments && iterableTypeArguments.length > 0 && isMultiReturnType(iterableTypeArguments[0])) {
6772
const luaIterator = context.transformExpression(statement.expression);
6873
return transformForOfMultiIterableStatement(
6974
context,

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,3 +373,31 @@ describe("LuaMultiReturn returns all values even when indexed with [0] #1411", (
373373
.expectToEqual(1);
374374
});
375375
});
376+
377+
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1591
378+
test("LuaMultiReturn in LuaIterable (#1591)", () => {
379+
const lua = util.testModule`
380+
type IterableAlias = LuaIterable<LuaMultiReturn<[number, number]>>;
381+
382+
declare const iterable: IterableAlias;
383+
384+
for (const [a, b] of iterable) {}
385+
`
386+
.withLanguageExtensions()
387+
.getMainLuaCodeChunk();
388+
389+
expect(lua).toContain("a, b");
390+
});
391+
392+
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1591
393+
test("LuaMultiReturn in LuaIterable intersection (#1591)", () => {
394+
const lua = util.testModule`
395+
declare function iterator(): { a: string } & LuaIterable<LuaMultiReturn<[string, string]>>;
396+
397+
for (const [a, b] of iterator()) {}
398+
`
399+
.withLanguageExtensions()
400+
.getMainLuaCodeChunk();
401+
402+
expect(lua).toContain("a, b");
403+
});

0 commit comments

Comments
 (0)
X Tutup