Skip to content

Commit b84686f

Browse files
authored
Fix destructuring assignment of multiReturn (closes #995) (#997)
* Fix destructuring assignment of multiReturn (closes #995) Added a test. * Rename test and add test for null return * Splitting tests
1 parent 70e9eb2 commit b84686f

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

src/transformation/visitors/variable-declaration.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { isTupleReturnCall } from "../utils/annotations";
66
import { validateAssignment } from "../utils/assignment-validation";
77
import { unsupportedVarDeclaration } from "../utils/diagnostics";
88
import { addExportToIdentifier } from "../utils/export";
9-
import { createLocalOrExportedOrGlobalDeclaration, createUnpackCall } from "../utils/lua-ast";
9+
import { createLocalOrExportedOrGlobalDeclaration, createUnpackCall, wrapInTable } from "../utils/lua-ast";
1010
import { LuaLibFeature, transformLuaLibFunction } from "../utils/lualib";
1111
import { transformIdentifier } from "./identifier";
1212
import { isMultiReturnCall } from "./language-extensions/multi";
@@ -158,9 +158,11 @@ export function transformBindingVariableDeclaration(
158158
// Contain the expression in a temporary variable
159159
table = lua.createAnonymousIdentifier();
160160
if (initializer) {
161-
statements.push(
162-
lua.createVariableDeclarationStatement(table, context.transformExpression(initializer))
163-
);
161+
let expression = context.transformExpression(initializer);
162+
if (isTupleReturnCall(context, initializer) || isMultiReturnCall(context, initializer)) {
163+
expression = wrapInTable(expression);
164+
}
165+
statements.push(lua.createVariableDeclarationStatement(table, expression));
164166
}
165167
}
166168
statements.push(...transformBindingPattern(context, bindingPattern, table));

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ exports[`invalid $multi call (const [a = 0] = $multi()): diagnostics 1`] = `"mai
6969

7070
exports[`invalid $multi call (const {} = $multi();): code 1`] = `
7171
"local ____ = {
72-
____(_G)
72+
{
73+
____(_G)
74+
}
7375
}"
7476
`;
7577

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,33 @@ test("multi example use case", () => {
2424
.expectToEqual({ a: "foo", b: 5 });
2525
});
2626

27+
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/995
28+
test("Destructuring assignment of LuaMultiReturn", () => {
29+
util.testModule`
30+
function multiReturn(): LuaMultiReturn<[number, number, number]> {
31+
return $multi(1, 2, 3);
32+
}
33+
34+
const [a, ...b] = multiReturn();
35+
export {a, b};
36+
`
37+
.setOptions(multiProjectOptions)
38+
.expectToEqual({ a: 1, b: [2, 3] });
39+
});
40+
41+
test("Destructuring assignment of LuaMultiReturn returning nil", () => {
42+
util.testModule`
43+
function multiReturn(): LuaMultiReturn<[number, number, number]> {
44+
return;
45+
}
46+
47+
const [a, ...b] = multiReturn();
48+
export {a, b};
49+
`
50+
.setOptions(multiProjectOptions)
51+
.expectToEqual({ a: undefined, b: [] });
52+
});
53+
2754
test.each<[string, any]>([
2855
["$multi()", undefined],
2956
["$multi(true)", true],

0 commit comments

Comments
 (0)