From cb10d86379c826752af174812579f267f698b8a5 Mon Sep 17 00:00:00 2001 From: Yan Couto Date: Thu, 4 Mar 2021 22:28:16 +0000 Subject: [PATCH 1/3] Fix destructuring assignment of multiReturn (closes #995) Added a test. --- src/transformation/visitors/variable-declaration.ts | 10 ++++++---- .../__snapshots__/multi.spec.ts.snap | 4 +++- test/unit/language-extensions/multi.spec.ts | 13 +++++++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/transformation/visitors/variable-declaration.ts b/src/transformation/visitors/variable-declaration.ts index 12f6717c4..d9f1624c1 100644 --- a/src/transformation/visitors/variable-declaration.ts +++ b/src/transformation/visitors/variable-declaration.ts @@ -6,7 +6,7 @@ import { isTupleReturnCall } from "../utils/annotations"; import { validateAssignment } from "../utils/assignment-validation"; import { unsupportedVarDeclaration } from "../utils/diagnostics"; import { addExportToIdentifier } from "../utils/export"; -import { createLocalOrExportedOrGlobalDeclaration, createUnpackCall } from "../utils/lua-ast"; +import { createLocalOrExportedOrGlobalDeclaration, createUnpackCall, wrapInTable } from "../utils/lua-ast"; import { LuaLibFeature, transformLuaLibFunction } from "../utils/lualib"; import { transformIdentifier } from "./identifier"; import { isMultiReturnCall } from "./language-extensions/multi"; @@ -158,9 +158,11 @@ export function transformBindingVariableDeclaration( // Contain the expression in a temporary variable table = lua.createAnonymousIdentifier(); if (initializer) { - statements.push( - lua.createVariableDeclarationStatement(table, context.transformExpression(initializer)) - ); + let expression = context.transformExpression(initializer); + if (isTupleReturnCall(context, initializer) || isMultiReturnCall(context, initializer)) { + expression = wrapInTable(expression); + } + statements.push(lua.createVariableDeclarationStatement(table, expression)); } } statements.push(...transformBindingPattern(context, bindingPattern, table)); diff --git a/test/unit/language-extensions/__snapshots__/multi.spec.ts.snap b/test/unit/language-extensions/__snapshots__/multi.spec.ts.snap index a280fe331..b2b679d30 100644 --- a/test/unit/language-extensions/__snapshots__/multi.spec.ts.snap +++ b/test/unit/language-extensions/__snapshots__/multi.spec.ts.snap @@ -69,7 +69,9 @@ exports[`invalid $multi call (const [a = 0] = $multi()): diagnostics 1`] = `"mai exports[`invalid $multi call (const {} = $multi();): code 1`] = ` "local ____ = { - ____(_G) + { + ____(_G) + } }" `; diff --git a/test/unit/language-extensions/multi.spec.ts b/test/unit/language-extensions/multi.spec.ts index 0b99cf4dc..1101f777e 100644 --- a/test/unit/language-extensions/multi.spec.ts +++ b/test/unit/language-extensions/multi.spec.ts @@ -24,6 +24,19 @@ test("multi example use case", () => { .expectToEqual({ a: "foo", b: 5 }); }); +test("multi #995", () => { + util.testModule` + function multiReturn(): LuaMultiReturn<[number, number, number]> { + return $multi(1, 2, 3); + } + + const [a, ...b] = multiReturn(); + export {a, b}; + ` + .setOptions(multiProjectOptions) + .expectToEqual({ a: 1, b: [2, 3] }); +}); + test.each<[string, any]>([ ["$multi()", undefined], ["$multi(true)", true], From c87257fc820b71bc1e14cd7cd4df6877bee5678b Mon Sep 17 00:00:00 2001 From: Yan Couto Date: Sat, 6 Mar 2021 14:54:47 +0000 Subject: [PATCH 2/3] Rename test and add test for null return --- test/unit/language-extensions/multi.spec.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/unit/language-extensions/multi.spec.ts b/test/unit/language-extensions/multi.spec.ts index 1101f777e..81ebea2ad 100644 --- a/test/unit/language-extensions/multi.spec.ts +++ b/test/unit/language-extensions/multi.spec.ts @@ -24,7 +24,8 @@ test("multi example use case", () => { .expectToEqual({ a: "foo", b: 5 }); }); -test("multi #995", () => { +// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/995 +test("Destructuring assignment of LuaMultiReturn", () => { util.testModule` function multiReturn(): LuaMultiReturn<[number, number, number]> { return $multi(1, 2, 3); @@ -35,6 +36,16 @@ test("multi #995", () => { ` .setOptions(multiProjectOptions) .expectToEqual({ a: 1, b: [2, 3] }); + util.testModule` + function multiReturn(): LuaMultiReturn<[number, number, number]> { + return; + } + + const [a, ...b] = multiReturn(); + export {a, b}; + ` + .setOptions(multiProjectOptions) + .expectToEqual({ b: [] }); }); test.each<[string, any]>([ From 074fd15c09d4f57316451c56f8d1c1e8e4505133 Mon Sep 17 00:00:00 2001 From: Yan Couto Date: Sat, 6 Mar 2021 16:08:50 +0000 Subject: [PATCH 3/3] Splitting tests --- test/unit/language-extensions/multi.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/unit/language-extensions/multi.spec.ts b/test/unit/language-extensions/multi.spec.ts index 81ebea2ad..5d59aa4d0 100644 --- a/test/unit/language-extensions/multi.spec.ts +++ b/test/unit/language-extensions/multi.spec.ts @@ -36,6 +36,9 @@ test("Destructuring assignment of LuaMultiReturn", () => { ` .setOptions(multiProjectOptions) .expectToEqual({ a: 1, b: [2, 3] }); +}); + +test("Destructuring assignment of LuaMultiReturn returning nil", () => { util.testModule` function multiReturn(): LuaMultiReturn<[number, number, number]> { return; @@ -45,7 +48,7 @@ test("Destructuring assignment of LuaMultiReturn", () => { export {a, b}; ` .setOptions(multiProjectOptions) - .expectToEqual({ b: [] }); + .expectToEqual({ a: undefined, b: [] }); }); test.each<[string, any]>([