diff --git a/lua/cmp/core.lua b/lua/cmp/core.lua index 2cff402..ceab8e0 100644 --- a/lua/cmp/core.lua +++ b/lua/cmp/core.lua @@ -72,6 +72,9 @@ end ---@type table core.sources = {} +---@type table +core.sources_by_name = {} + ---@type cmp.Context core.context = context.new() @@ -79,11 +82,20 @@ core.context = context.new() ---@param s cmp.Source core.register_source = function(s) core.sources[s.id] = s + if not core.sources_by_name[s.name] then + core.sources_by_name[s.name] = {} + end + table.insert(core.sources_by_name[s.name], s) end ---Unregister source ---@param source_id string core.unregister_source = function(source_id) + local name = core.sources[source_id].name + core.sources_by_name[name] = vim.tbl_filter( + function (source) + return source.id ~= source_id + end, core.sources_by_name[name]) core.sources[source_id] = nil end @@ -118,12 +130,10 @@ end core.get_sources = function(statuses) local sources = {} for _, c in pairs(config.get().sources) do - for _, s in pairs(core.sources) do - if c.name == s.name then - if not statuses or vim.tbl_contains(statuses, s.status) then - if s:is_available() then - table.insert(sources, s) - end + for _, s in ipairs(core.sources_by_name[c.name] or {}) do + if not statuses or vim.tbl_contains(statuses, s.status) then + if s:is_available() then + table.insert(sources, s) end end end