commit 643c0ed571f1ac6e83f73ab2593132901278b4da
parent 6a4ebf894fa39bfb09695a129a3300cb99408542
Author: Gregory Anders <8965202+gpanders@users.noreply.github.com>
Date: Sat, 1 Apr 2023 08:02:58 -0600
feat: allow function passed to defaulttable to take an argument (#22839)
Pass the value of the key being accessed to the create function, to
allow users to dynamically generate default values.
Diffstat:
3 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt
@@ -1635,8 +1635,8 @@ defaulttable({create}) *vim.defaulttable()*
<
Parameters: ~
- • {create} (function|nil) The function called to create a missing
- value.
+ • {create} function?(key:any):any The function called to create a
+ missing value.
Return: ~
(table) Empty table with metamethod
diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua
@@ -796,13 +796,15 @@ end
--- a.b.c = 1
--- </pre>
---
----@param create function|nil The function called to create a missing value.
+---@param create function?(key:any):any The function called to create a missing value.
---@return table Empty table with metamethod
function vim.defaulttable(create)
- create = create or vim.defaulttable
+ create = create or function(_)
+ return vim.defaulttable()
+ end
return setmetatable({}, {
__index = function(tbl, key)
- rawset(tbl, key, create())
+ rawset(tbl, key, create(key))
return rawget(tbl, key)
end,
})
diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua
@@ -2915,6 +2915,15 @@ describe('lua stdlib', function()
return a
]])
end)
+
+ it('accepts the key name', function()
+ eq({ b = 'b', c = 'c' }, exec_lua [[
+ local a = vim.defaulttable(function(k) return k end)
+ local _ = a.b
+ local _ = a.c
+ return a
+ ]])
+ end)
end)
it('vim.lua_omnifunc', function()