Skip to content

Commit 3d28a52

Browse files
authored
Convert vim.NIL in client response item and itemDefaults to nil. Fixes #2212 (#2217)
1 parent da88697 commit 3d28a52

3 files changed

Lines changed: 55 additions & 0 deletions

File tree

lua/cmp/source.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,9 +360,13 @@ source.complete = function(self, ctx, callback)
360360
local old_offset = self.offset
361361
local old_entries = self.entries
362362

363+
response.itemDefaults = misc.ensure_nil(response.itemDefaults)
364+
363365
self.status = source.SourceStatus.COMPLETED
364366
self.entries = {}
365367
for _, item in ipairs(response.items or response) do
368+
item = misc.ensure_nil(item)
369+
366370
if item.label then
367371
local e = entry.new(ctx, self, item, response.itemDefaults)
368372
if not e:is_invalid() then

lua/cmp/utils/misc.lua

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,31 @@ misc.merge = function(tbl1, tbl2)
120120
end
121121
end
122122

123+
---Replaces all vim.NIL values with nil recursively
124+
---@generic T
125+
---@param tbl T
126+
---@return T
127+
misc.ensure_nil = function(tbl)
128+
local is_dict = type(tbl) == 'table' and (not islist(tbl) or vim.tbl_isempty(tbl))
129+
if is_dict then
130+
local new_tbl = {}
131+
for k, v in pairs(tbl) do
132+
if v ~= misc.none then
133+
new_tbl[k] = misc.ensure_nil(v)
134+
else
135+
new_tbl[k] = nil
136+
end
137+
end
138+
return new_tbl
139+
end
140+
141+
if tbl == misc.none then
142+
return nil
143+
else
144+
return tbl
145+
end
146+
end
147+
123148
---Generate id for group name
124149
misc.id = setmetatable({
125150
group = {},

lua/cmp/utils/misc_spec.lua

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,30 @@ describe('misc', function()
8787
})
8888
assert.are.equal(merged.a, nil)
8989
end)
90+
91+
it('ensure_nil', function()
92+
local ensured
93+
ensured = misc.ensure_nil({ a = {} })
94+
assert.are.same(ensured, { a = {} })
95+
96+
ensured = misc.ensure_nil(nil)
97+
assert.are.equal(ensured, nil)
98+
99+
ensured = misc.ensure_nil(1)
100+
assert.are.equal(ensured, 1)
101+
102+
ensured = misc.ensure_nil({
103+
a = {
104+
a = 1,
105+
b = nil,
106+
c = misc.none,
107+
d = false,
108+
e = "",
109+
},
110+
})
111+
assert.are.equal(ensured.a.a, 1)
112+
assert.are.equal(ensured.a.b, nil)
113+
assert.are.equal(ensured.a.c, nil)
114+
assert.are.equal(ensured.a.e, "")
115+
end)
90116
end)

0 commit comments

Comments
 (0)