X Tutup
Skip to content

Commit 284a672

Browse files
authored
Fix delete operator (#1160)
* Fix delete operator * Fix delete test formatting * strict mode on object delete test
1 parent 3cc52f4 commit 284a672

File tree

3 files changed

+35
-16
lines changed

3 files changed

+35
-16
lines changed

src/LuaLib.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ const luaLibDependencies: Partial<Record<LuaLibFeature, LuaLibFeature[]>> = {
106106
Await: [LuaLibFeature.InstanceOf, LuaLibFeature.New],
107107
Decorate: [LuaLibFeature.ObjectGetOwnPropertyDescriptor, LuaLibFeature.SetDescriptor, LuaLibFeature.ObjectAssign],
108108
DelegatedYield: [LuaLibFeature.StringAccess],
109-
Delete: [LuaLibFeature.ObjectGetOwnPropertyDescriptors],
109+
Delete: [LuaLibFeature.ObjectGetOwnPropertyDescriptors, LuaLibFeature.Error, LuaLibFeature.New],
110110
Error: [LuaLibFeature.Class, LuaLibFeature.ClassExtends, LuaLibFeature.New],
111111
FunctionBind: [LuaLibFeature.Unpack],
112112
Generator: [LuaLibFeature.Symbol],

src/lualib/Delete.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,13 @@ function __TS__Delete(this: void, target: any, key: any): boolean {
33
const descriptor = descriptors[key];
44
if (descriptor) {
55
if (!descriptor.configurable) {
6-
throw `Cannot delete property ${key} of ${target}.`;
6+
throw new TypeError(`Cannot delete property ${key} of ${target}.`);
77
}
88

99
descriptors[key] = undefined;
1010
return true;
1111
}
1212

13-
if (target[key] !== undefined) {
14-
target[key] = undefined;
15-
return true;
16-
}
17-
18-
return false;
13+
target[key] = undefined;
14+
return true;
1915
}

test/unit/builtins/object.spec.ts

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -222,22 +222,45 @@ describe("delete from object", () => {
222222
test("delete from object", () => {
223223
util.testFunction`
224224
const obj = { foo: "bar", bar: "baz" };
225-
delete obj["foo"];
226-
return obj;
227-
`
228-
.setTsHeader("declare function setmetatable<T extends object>(this: void, table: T, metatable: any): T;")
229-
.expectToEqual({ bar: "baz" });
225+
return [delete obj["foo"], obj];
226+
`.expectToMatchJsResult();
227+
});
228+
229+
test("delete nonexistent property", () => {
230+
util.testFunction`
231+
const obj = {} as any
232+
return [delete obj["foo"], obj];
233+
`.expectToMatchJsResult();
230234
});
231235

232236
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/993
233237
test("delete from object with metatable", () => {
234238
util.testFunction`
235239
const obj = { foo: "bar", bar: "baz" };
236240
setmetatable(obj, {});
237-
delete obj["foo"];
238-
return obj;
241+
return [delete obj["foo"], obj];
239242
`
240243
.setTsHeader("declare function setmetatable<T extends object>(this: void, table: T, metatable: any): T;")
241-
.expectToEqual({ bar: "baz" });
244+
.expectToEqual([true, { bar: "baz" }]);
245+
});
246+
247+
test("delete nonconfigurable own property", () => {
248+
util.testFunction`
249+
const obj = {} as any
250+
Object.defineProperty(obj, "foo", {
251+
configurable: false,
252+
value: true
253+
})
254+
try {
255+
delete obj["foo"]
256+
return "deleted"
257+
} catch (e) {
258+
return e instanceof TypeError
259+
}
260+
`
261+
.setOptions({
262+
strict: true,
263+
})
264+
.expectToMatchJsResult();
242265
});
243266
});

0 commit comments

Comments
 (0)
X Tutup