diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index 7d7420ca6..bbc7e59a1 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -3715,7 +3715,7 @@ export class LuaTransformer { case "unshift": return this.transformLuaLibFunction(LuaLibFeature.ArrayUnshift, node, caller, ...params); case "sort": - return this.transformLuaLibFunction(LuaLibFeature.ArraySort, node, caller); + return this.transformLuaLibFunction(LuaLibFeature.ArraySort, node, caller, ...params); case "pop": return tstl.createCallExpression( tstl.createTableIndexExpression(tstl.createIdentifier("table"), tstl.createStringLiteral("remove")), diff --git a/src/lualib/ArraySort.ts b/src/lualib/ArraySort.ts index 18745695c..01229598d 100644 --- a/src/lualib/ArraySort.ts +++ b/src/lualib/ArraySort.ts @@ -1,7 +1,11 @@ declare namespace table { - function sort(arr: T[], compareFn?: (a: T, b: T) => number): void; + function sort(arr: T[], compareFn?: (a: T, b: T) => boolean): void; } function __TS__ArraySort(arr: T[], compareFn?: (a: T, b: T) => number): T[] { - table.sort(arr, compareFn); + if (compareFn !== undefined) { + table.sort(arr, (a, b) => compareFn(a, b) < 0); + } else { + table.sort(arr); + } return arr; } diff --git a/test/unit/lualib/lualib.spec.ts b/test/unit/lualib/lualib.spec.ts index be87d1084..f0f0a0257 100644 --- a/test/unit/lualib/lualib.spec.ts +++ b/test/unit/lualib/lualib.spec.ts @@ -352,6 +352,29 @@ export class LuaLibTests // Assert Expect(result).toBe(JSON.stringify(expected)); } + + @Test("array.sort with compare function") + @TestCase([1, 2, 3, 4, 5], "a - b", (a: number, b: number) => a - b) + @TestCase(["4", "5", "3", "2", "1"], "tonumber(a) - tonumber(b)", (a: string, b: string) => Number(a) - Number(b)) + @TestCase(["4", "5", "3", "2", "1"], "tonumber(b) - tonumber(a)", (a: string, b: string) => Number(b) - Number(a)) + public arraySortWithCompareFunction( + array: any[], + compareStr: string, + compareFn: (a: any, b: any) => number + ): void { + const result = util.transpileAndExecute( + `let testArray = ${JSON.stringify(array)}; + testArray.sort((a, b) => ${compareStr}); + return JSONStringify(testArray)`, + undefined, + undefined, + `declare function tonumber(e: any): number` + ); + + // Assert + Expect(result).toBe(JSON.stringify(array.sort(compareFn))); + } + @TestCase("true", "4", "5", 4) @TestCase("false", "4", "5", 5) @TestCase("3", "4", "5", 4)