From 60384dc2a60e8d2e966c0f0e9064590f2c3b28bd Mon Sep 17 00:00:00 2001 From: Hirokazu Hata Date: Sun, 22 Mar 2020 13:50:08 +0900 Subject: util: add behavior options to tbl_deep_extend function tbl_deep_extend always override extended table properties. This behavior is not expected. This will fix #155. --- lua/nvim_lsp/util.lua | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) (limited to 'lua/nvim_lsp/util.lua') diff --git a/lua/nvim_lsp/util.lua b/lua/nvim_lsp/util.lua index 33eff0c9..1c68e1fc 100644 --- a/lua/nvim_lsp/util.lua +++ b/lua/nvim_lsp/util.lua @@ -46,20 +46,38 @@ function M.add_hook_after(func, new_fn) end end -function M.tbl_deep_extend(dst, ...) - validate { dst = { dst, 't' } } - for i = 1, select("#", ...) do - local t = select(i, ...) - validate { arg = { t, 't' } } - for k, v in pairs(t) do - if type(v) == 'table' and not vim.tbl_islist(v) then - dst[k] = M.tbl_deep_extend(dst[k] or vim.empty_dict(), v) - else - dst[k] = v +function M.tbl_deep_extend(behavior, ...) + if (behavior ~= 'error' and behavior ~= 'keep' and behavior ~= 'force') then + error('invalid "behavior": '..tostring(behavior)) + end + + if select('#', ...) < 2 then + error('wrong number of arguments (given '..tostring(1 + select('#', ...))..', expected at least 3)') + end + + local ret = {} + if vim._empty_dict_mt ~= nil and getmetatable(select(1, ...)) == vim._empty_dict_mt then + ret = vim.empty_dict() + end + + for i = 1, select('#', ...) do + local tbl = select(i, ...) + vim.validate{["after the second argument"] = {tbl,'t'}} + if tbl then + for k, v in pairs(tbl) do + if type(v) == 'table' and not vim.tbl_islist(v) then + ret[k] = M.tbl_deep_extend(behavior, ret[k] or vim.empty_dict(), v) + elseif behavior ~= 'force' and ret[k] ~= nil then + if behavior == 'error' then + error('key found in more than one map: '..k) + end -- Else behavior is "keep". + else + ret[k] = v + end end end end - return dst + return ret end function M.nvim_multiline_command(command) -- cgit v1.2.3-70-g09d2