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)
This commit is contained in:
Gregory Anders
2023-04-07 08:22:47 -06:00
committed by GitHub
parent 82cfedab50
commit d675bd01b1
3 changed files with 48 additions and 11 deletions

View File

@@ -1,18 +1,29 @@
local F = {} local F = {}
--- Returns {a} if it is not nil, otherwise returns {b}. --- Returns the first argument which is not nil.
--- ---
---@generic A --- If all arguments are nil, returns nil.
---@generic B
--- ---
---@param a A --- Examples:
---@param b B --- <pre>
---@return A | B --- local a = nil
function F.if_nil(a, b) --- local b = nil
if a == nil then --- local c = 42
return b --- 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 end
return nil
end end
-- Use in combination with pcall -- Use in combination with pcall

View File

@@ -3,7 +3,7 @@ vim.api.nvim_create_autocmd({ 'BufNewFile', 'BufRead', 'BufFilePost' }, {
group = group, group = group,
callback = function(args) callback = function(args)
-- Buffer-local enable has higher priority -- 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 if not enable then
return return
end end

View File

@@ -2967,6 +2967,32 @@ describe('lua stdlib', function()
}]], }]],
eval[[execute('lua vim.print(42, "abc", { a = { b = 77 }})')]]) eval[[execute('lua vim.print(42, "abc", { a = { b = 77 }})')]])
end) 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) end)
describe('lua: builtin modules', function() describe('lua: builtin modules', function()