diff options
author | Gregory Anders <8965202+gpanders@users.noreply.github.com> | 2023-04-07 08:22:47 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-07 08:22:47 -0600 |
commit | d675bd01b1e78b93e559320b262bdae40b3b54b2 (patch) | |
tree | 2ede624b4ad283bcadebbd26382d7521d6114937 | |
parent | 82cfedab5009c0f5003451ef0b105a019887edb3 (diff) | |
download | rneovim-d675bd01b1e78b93e559320b262bdae40b3b54b2.tar.gz rneovim-d675bd01b1e78b93e559320b262bdae40b3b54b2.tar.bz2 rneovim-d675bd01b1e78b93e559320b262bdae40b3b54b2.zip |
feat(lua): allow vim.F.if_nil to take multiple arguments (#22903)
The first argument which is non-nil is returned. This is useful when
using nested default values (e.g. in the EditorConfig plugin).
Before:
local enable = vim.F.if_nil(vim.b.editorconfig, vim.F.if_nil(vim.g.editorconfig, true))
After:
local enable = vim.F.if_nil(vim.b.editorconfig, vim.g.editorconfig, true)
-rw-r--r-- | runtime/lua/vim/F.lua | 31 | ||||
-rw-r--r-- | runtime/plugin/editorconfig.lua | 2 | ||||
-rw-r--r-- | test/functional/lua/vim_spec.lua | 26 |
3 files changed, 48 insertions, 11 deletions
diff --git a/runtime/lua/vim/F.lua b/runtime/lua/vim/F.lua index 3e370c0a84..16c834b371 100644 --- a/runtime/lua/vim/F.lua +++ b/runtime/lua/vim/F.lua @@ -1,18 +1,29 @@ local F = {} ---- Returns {a} if it is not nil, otherwise returns {b}. +--- Returns the first argument which is not nil. --- ----@generic A ----@generic B +--- If all arguments are nil, returns nil. --- ----@param a A ----@param b B ----@return A | B -function F.if_nil(a, b) - if a == nil then - return b +--- Examples: +--- <pre> +--- local a = nil +--- local b = nil +--- local c = 42 +--- local d = true +--- assert(vim.F.if_nil(a, b, c, d) == 42) +--- </pre> +--- +---@param ... any +---@return any +function F.if_nil(...) + local nargs = select('#', ...) + for i = 1, nargs do + local v = select(i, ...) + if v ~= nil then + return v + end end - return a + return nil end -- Use in combination with pcall diff --git a/runtime/plugin/editorconfig.lua b/runtime/plugin/editorconfig.lua index 54cd0e828e..a96919e1fe 100644 --- a/runtime/plugin/editorconfig.lua +++ b/runtime/plugin/editorconfig.lua @@ -3,7 +3,7 @@ vim.api.nvim_create_autocmd({ 'BufNewFile', 'BufRead', 'BufFilePost' }, { group = group, callback = function(args) -- Buffer-local enable has higher priority - local enable = vim.F.if_nil(vim.b.editorconfig, vim.F.if_nil(vim.g.editorconfig, true)) + local enable = vim.F.if_nil(vim.b.editorconfig, vim.g.editorconfig, true) if not enable then return end diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua index 9508469a61..45d9263c0c 100644 --- a/test/functional/lua/vim_spec.lua +++ b/test/functional/lua/vim_spec.lua @@ -2967,6 +2967,32 @@ describe('lua stdlib', function() }]], eval[[execute('lua vim.print(42, "abc", { a = { b = 77 }})')]]) end) + + it('vim.F.if_nil', function() + local function if_nil(...) + return exec_lua([[ + local args = {...} + local nargs = select('#', ...) + for i = 1, nargs do + if args[i] == vim.NIL then + args[i] = nil + end + end + return vim.F.if_nil(unpack(args, 1, nargs)) + ]], ...) + end + + local a = NIL + local b = NIL + local c = 42 + local d = false + eq(42, if_nil(a, c)) + eq(false, if_nil(d, b)) + eq(42, if_nil(a, b, c, d)) + eq(false, if_nil(d)) + eq(false, if_nil(d, c)) + eq(NIL, if_nil(a)) + end) end) describe('lua: builtin modules', function() |