From d466631a5fa33cefb44334ef1278322123fddba2 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sat, 12 Jun 2021 14:05:32 +0200 Subject: [PATCH 1/4] Implement array.entries --- src/LuaLib.ts | 1 + src/lualib/ArrayEntries.ts | 14 ++++++++++++++ src/transformation/builtins/array.ts | 2 ++ test/unit/builtins/array.spec.ts | 14 ++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 src/lualib/ArrayEntries.ts diff --git a/src/LuaLib.ts b/src/LuaLib.ts index dc4501d86..d98b78044 100644 --- a/src/LuaLib.ts +++ b/src/LuaLib.ts @@ -3,6 +3,7 @@ import { EmitHost } from "./transpilation"; export enum LuaLibFeature { ArrayConcat = "ArrayConcat", + ArrayEntries = "ArrayEntries", ArrayEvery = "ArrayEvery", ArrayFilter = "ArrayFilter", ArrayForEach = "ArrayForEach", diff --git a/src/lualib/ArrayEntries.ts b/src/lualib/ArrayEntries.ts new file mode 100644 index 000000000..7d12f1347 --- /dev/null +++ b/src/lualib/ArrayEntries.ts @@ -0,0 +1,14 @@ +// https://262.ecma-international.org/10.0/#sec-array.prototype.entries +function __TS__ArrayEntries(this: void, array: T[]): IterableIterator<[number, T]> { + let key = 0; + return { + [Symbol.iterator](): IterableIterator<[number, T]> { + return this; + }, + next(): IteratorResult<[number, T]> { + const result = { done: array[key] === undefined, value: [key, array[key]] as [number, T] }; + key++; + return result; + }, + }; +} diff --git a/src/transformation/builtins/array.ts b/src/transformation/builtins/array.ts index a04e0e98b..d8bd4dd3b 100644 --- a/src/transformation/builtins/array.ts +++ b/src/transformation/builtins/array.ts @@ -36,6 +36,8 @@ export function transformArrayPrototypeCall( switch (expressionName) { case "concat": return transformLuaLibFunction(context, LuaLibFeature.ArrayConcat, node, caller, ...params); + case "entries": + return transformLuaLibFunction(context, LuaLibFeature.ArrayEntries, node, caller); case "push": return transformLuaLibFunction(context, LuaLibFeature.ArrayPush, node, caller, ...params); case "reverse": diff --git a/test/unit/builtins/array.spec.ts b/test/unit/builtins/array.spec.ts index 770387aea..0b62b09cf 100644 --- a/test/unit/builtins/array.spec.ts +++ b/test/unit/builtins/array.spec.ts @@ -594,6 +594,20 @@ describe.each(["reduce", "reduceRight"])("array.%s", reduce => { }); }); +test.each([{ array: [] }, { array: ["a", "b", "c"] }, { array: [{ foo: "foo" }, { bar: "bar" }] }])( + "array.entries (%p)", + ({ array }) => { + util.testFunction` + const array = ${util.formatCode(array)}; + const result = []; + for (const [i, v] of array.entries()) { + result.push([i, v]); + } + return result; + `.expectToMatchJsResult(); + } +); + const genericChecks = [ "function generic(array: T)", "function generic(array: T)", From 63e66d6235abadc7365ef858ba39dfc64f04c341 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sat, 12 Jun 2021 14:44:59 +0200 Subject: [PATCH 2/4] Added extra test for indirect use of array.entries() --- test/unit/builtins/array.spec.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/test/unit/builtins/array.spec.ts b/test/unit/builtins/array.spec.ts index 0b62b09cf..24a943f41 100644 --- a/test/unit/builtins/array.spec.ts +++ b/test/unit/builtins/array.spec.ts @@ -598,15 +598,26 @@ test.each([{ array: [] }, { array: ["a", "b", "c"] }, { array: [{ foo: "foo" }, "array.entries (%p)", ({ array }) => { util.testFunction` - const array = ${util.formatCode(array)}; + const array = ${util.formatCode(array)}; + const result = []; + for (const [i, v] of array.entries()) { + result.push([i, v]); + } + return result; + `.expectToMatchJsResult(); + } +); + +test("array.entries indirect use", () => { + util.testFunction` + const entries = ["a", "b", "c"].entries(); const result = []; - for (const [i, v] of array.entries()) { + for (const [i, v] of entries) { result.push([i, v]); } return result; `.expectToMatchJsResult(); - } -); +}); const genericChecks = [ "function generic(array: T)", From 479621535689ee7795efcdb0770bae4d745a408a Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sat, 12 Jun 2021 14:47:17 +0200 Subject: [PATCH 3/4] Added destructuring test for array.entries --- test/unit/builtins/array.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/unit/builtins/array.spec.ts b/test/unit/builtins/array.spec.ts index 24a943f41..5a1d3bf99 100644 --- a/test/unit/builtins/array.spec.ts +++ b/test/unit/builtins/array.spec.ts @@ -619,6 +619,10 @@ test("array.entries indirect use", () => { `.expectToMatchJsResult(); }); +test("array.entries destructured", () => { + util.testExpression`[...["a", "b", "c"].entries()]`.expectToMatchJsResult(); +}) + const genericChecks = [ "function generic(array: T)", "function generic(array: T)", From 2e0939d050f8fa459df5db311876c8c3b020feb2 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sat, 12 Jun 2021 14:48:51 +0200 Subject: [PATCH 4/4] Fix prettier --- test/unit/builtins/array.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/builtins/array.spec.ts b/test/unit/builtins/array.spec.ts index 5a1d3bf99..037ebe2a7 100644 --- a/test/unit/builtins/array.spec.ts +++ b/test/unit/builtins/array.spec.ts @@ -621,7 +621,7 @@ test("array.entries indirect use", () => { test("array.entries destructured", () => { util.testExpression`[...["a", "b", "c"].entries()]`.expectToMatchJsResult(); -}) +}); const genericChecks = [ "function generic(array: T)",