darklua icon indicating copy to clipboard operation
darklua copied to clipboard

A rule for removing duplicated numeric field in table

Open jiwonz opened this issue 1 year ago • 2 comments

Luau and Lua have different behavior between numeric field in table for example:

Luau:

{ 1, [1] = "A" } -- { "A" }
{ [1] = "A", 1 } -- { 1 }

Lua:

{ 1, [1] = "A" } -- { 1 }
{ [1] = "A", 1 } -- { 1 }

I think Luau checks the orders of them while Lua always think array item is first than indexing. For easy understand, Luau is behaving

local a = { 1, [1] = "A" }

as

local a = { 1 }
a[1] = "A"

So, my idea is

local a = { 1, [1] = "A" }
local b = { [1] = "A", 1 }

into

local a = { "A" }
local b = { 1 }

I'm not sure what to name the rule, but it might help when transpiling Luau to Lua.

jiwonz avatar Sep 04 '24 11:09 jiwonz

This Lua behavior isn't exclusive to numeric keys, this applies to any table key.

print({ ["a"] = 1, ["a"] = 2 }) --> { ["a"] = 2 }

-- Another example showing it applies to all keys (no matter the type).
local userdata = newproxy()
print({ [userdata] = 1, [userdata] = 2 }) --> { [Userdata(...)] = 2 }

Perhaps it could be called "remove_duplicate_table_keys"?

ewd3v avatar Nov 07 '24 11:11 ewd3v

This Lua behavior isn't exclusive to numeric keys, this applies to any table key.

print({ ["a"] = 1, ["a"] = 2 }) --> { ["a"] = 2 }

-- Another example showing it applies to all keys (no matter the type).
local userdata = newproxy()
print({ [userdata] = 1, [userdata] = 2 }) --> { [Userdata(...)] = 2 }

Perhaps it could be called "remove_duplicate_table_keys"?

You are correct. So I named it remove_redeclared_keys in my fork implementation.

jiwonz avatar Nov 12 '24 05:11 jiwonz

I'll close this issue as I don't really see the value of this transform. I think it's too much relying on runtime-specific details. A linter could also warn about this kind of code since it's a bit confusing for readers of code like that.

jeparlefrancais avatar Aug 11 '25 17:08 jeparlefrancais