fix(api): make nvim_get_hl not return non-existing groups

fixes #23063
This commit is contained in:
bfredl 2023-04-13 14:08:36 +02:00
parent 231e1988ed
commit d05d63a18f
2 changed files with 25 additions and 0 deletions

View File

@ -1530,6 +1530,10 @@ static bool hlgroup2dict(Dictionary *hl, NS ns_id, int hl_id, Arena *arena)
if (link == -1) {
return false;
}
if (ns_id == 0 && sgp->sg_cleared && sgp->sg_set == 0) {
// table entry was created but not ever set
return false;
}
HlAttrs attr =
syn_attr2entry(ns_id == 0 ? sgp->sg_attr : ns_get_hl(&ns_id, hl_id, false, sgp->sg_set));
*hl = arena_dict(arena, HLATTRS_DICT_SIZE + 1);

View File

@ -575,4 +575,25 @@ describe('API: get highlight', function()
meths.set_hl(0, 'Foo', hl)
eq(hl, meths.get_hl(0, { name = 'Foo', link = true }))
end)
it("doesn't contain unset groups", function()
local id = meths.get_hl_id_by_name "@foobar.hubbabubba"
ok(id > 0)
local data = meths.get_hl(0, {})
eq(nil, data["@foobar.hubbabubba"])
eq(nil, data["@foobar"])
command 'hi @foobar.hubbabubba gui=bold'
data = meths.get_hl(0, {})
eq({bold = true}, data["@foobar.hubbabubba"])
eq(nil, data["@foobar"])
-- @foobar.hubbabubba was explicitly cleared and thus shows up
-- but @foobar was never touched, and thus doesn't
command 'hi clear @foobar.hubbabubba'
data = meths.get_hl(0, {})
eq({}, data["@foobar.hubbabubba"])
eq(nil, data["@foobar"])
end)
end)