From 2dd1c45e895e3e6054e6d9a7bd5e4ffcc7a2fca9 Mon Sep 17 00:00:00 2001 From: ark120202 Date: Fri, 22 May 2020 23:57:41 +0000 Subject: [PATCH 1/2] Don't use lualib for .call and .apply --- src/LuaLib.ts | 4 +--- src/lualib/FunctionApply.ts | 7 ------- src/lualib/FunctionCall.ts | 3 --- src/transformation/builtins/function.ts | 9 +++++++-- .../unit/annotations/__snapshots__/forRange.spec.ts.snap | 5 +---- 5 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 src/lualib/FunctionApply.ts delete mode 100644 src/lualib/FunctionCall.ts diff --git a/src/LuaLib.ts b/src/LuaLib.ts index 8c27e5730..5d1575b5e 100644 --- a/src/LuaLib.ts +++ b/src/LuaLib.ts @@ -30,9 +30,7 @@ export enum LuaLibFeature { Decorate = "Decorate", Descriptors = "Descriptors", Error = "Error", - FunctionApply = "FunctionApply", FunctionBind = "FunctionBind", - FunctionCall = "FunctionCall", InstanceOf = "InstanceOf", InstanceOfObject = "InstanceOfObject", Iterator = "Iterator", @@ -71,7 +69,7 @@ export enum LuaLibFeature { const luaLibDependencies: Partial> = { ArrayFlat: [LuaLibFeature.ArrayConcat], ArrayFlatMap: [LuaLibFeature.ArrayConcat], - Error: [LuaLibFeature.New, LuaLibFeature.Class, LuaLibFeature.FunctionCall], + Error: [LuaLibFeature.New, LuaLibFeature.Class], InstanceOf: [LuaLibFeature.Symbol], Iterator: [LuaLibFeature.Symbol], ObjectFromEntries: [LuaLibFeature.Iterator, LuaLibFeature.Symbol], diff --git a/src/lualib/FunctionApply.ts b/src/lualib/FunctionApply.ts deleted file mode 100644 index 294efdda9..000000000 --- a/src/lualib/FunctionApply.ts +++ /dev/null @@ -1,7 +0,0 @@ -function __TS__FunctionApply(this: void, fn: (this: void, ...args: any[]) => any, thisArg: any, args?: any[]): any { - if (args) { - return fn(thisArg, (unpack || table.unpack)(args)); - } else { - return fn(thisArg); - } -} diff --git a/src/lualib/FunctionCall.ts b/src/lualib/FunctionCall.ts deleted file mode 100644 index e9b50fbbe..000000000 --- a/src/lualib/FunctionCall.ts +++ /dev/null @@ -1,3 +0,0 @@ -function __TS__FunctionCall(this: void, fn: (this: void, ...args: any[]) => any, thisArg: any, ...args: any[]): any { - return fn(thisArg, (unpack || table.unpack)(args)); -} diff --git a/src/transformation/builtins/function.ts b/src/transformation/builtins/function.ts index 3ba8c2aaa..0d84e48a8 100644 --- a/src/transformation/builtins/function.ts +++ b/src/transformation/builtins/function.ts @@ -2,6 +2,7 @@ import * as lua from "../../LuaAST"; import { TransformationContext } from "../context"; import { unsupportedProperty, unsupportedSelfFunctionConversion } from "../utils/diagnostics"; import { ContextType, getFunctionContextType } from "../utils/function-context"; +import { createUnpackCall } from "../utils/lua-ast"; import { LuaLibFeature, transformLuaLibFunction } from "../utils/lualib"; import { PropertyCallExpression, transformArguments } from "../visitors/call"; @@ -21,11 +22,15 @@ export function transformFunctionPrototypeCall( const expressionName = expression.name.text; switch (expressionName) { case "apply": - return transformLuaLibFunction(context, LuaLibFeature.FunctionApply, node, caller, ...params); + return lua.createCallExpression( + caller, + [params[0], createUnpackCall(context, params[1], node.arguments[1])], + node + ); case "bind": return transformLuaLibFunction(context, LuaLibFeature.FunctionBind, node, caller, ...params); case "call": - return transformLuaLibFunction(context, LuaLibFeature.FunctionCall, node, caller, ...params); + return lua.createCallExpression(caller, params, node); default: context.diagnostics.push(unsupportedProperty(expression.name, "function", expressionName)); } diff --git a/test/unit/annotations/__snapshots__/forRange.spec.ts.snap b/test/unit/annotations/__snapshots__/forRange.spec.ts.snap index 325c32be7..e752d0782 100644 --- a/test/unit/annotations/__snapshots__/forRange.spec.ts.snap +++ b/test/unit/annotations/__snapshots__/forRange.spec.ts.snap @@ -70,10 +70,7 @@ exports[`invalid usage reference ("let array = [0, luaRange, 1];"): code 1`] = ` exports[`invalid usage reference ("let array = [0, luaRange, 1];"): diagnostics 1`] = `"main.ts(6,29): error TSTL: Invalid @forRange call: can be used only as an iterable in a for...of loop."`; -exports[`invalid usage reference ("luaRange.call(null, 0, 0, 0);"): code 1`] = ` -"require(\\"lualib_bundle\\"); -__TS__FunctionCall(luaRange, nil, 0, 0, 0)" -`; +exports[`invalid usage reference ("luaRange.call(null, 0, 0, 0);"): code 1`] = `"luaRange(nil, 0, 0, 0)"`; exports[`invalid usage reference ("luaRange.call(null, 0, 0, 0);"): diagnostics 1`] = `"main.ts(6,13): error TSTL: Invalid @forRange call: can be used only as an iterable in a for...of loop."`; From 986b8ba682d16b3ce0fdd143ece2af162757824c Mon Sep 17 00:00:00 2001 From: ark120202 Date: Sun, 24 May 2020 14:24:28 +0000 Subject: [PATCH 2/2] Fix flaky array.join test --- test/unit/builtins/array.spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/unit/builtins/array.spec.ts b/test/unit/builtins/array.spec.ts index 075de32e9..44fe1fa0e 100644 --- a/test/unit/builtins/array.spec.ts +++ b/test/unit/builtins/array.spec.ts @@ -430,11 +430,12 @@ test.each([ }); test('array.join (1, "2", {})', () => { - util.testExpression`[1, "2", {}].join()`.expectToEqual("1,2,table: 0x168"); + const result = util.testExpression`[1, "2", {}].join()`.getLuaExecutionResult(); + expect(result).toMatch(/^1,2,table: 0x\d+$/); }); test('array.join (1, "2", Symbol("foo"))', () => { - util.testExpression`[1, "2", Symbol("foo")].join()`.expectToEqual("1,2,Symbol(foo)"); + util.testExpression`[1, "2", Symbol("foo")].join(", ")`.expectToEqual("1, 2, Symbol(foo)"); }); test("array.join without separator argument", () => {