discard_deps_revisited: better naming and a little dry

This commit is contained in:
abeldekat 2023-08-02 09:04:17 +02:00
commit 08fcf83957

View file

@ -54,54 +54,57 @@ function Spec:has_unused_plugins()
end end
---@return string[] ---@return string[]
function Spec:collect_dirty() function Spec:names_to_repair()
---@return LazyPlugin[] ---@return LazyPlugin[]
local function collect_unused_plugins() local function collect_unused_plugins()
local unused_plugins = vim.list_extend({}, vim.tbl_values(self.optional_only)) local unused = vim.list_extend({}, vim.tbl_values(self.optional_only))
return vim.list_extend(unused_plugins, vim.tbl_values(self.disabled)) return vim.list_extend(unused, vim.tbl_values(self.disabled))
end end
---@type string[] ---@type string[]
local candidates = {} local deps_in_unused = {}
for _, plugin in pairs(collect_unused_plugins()) do for _, plugin in pairs(collect_unused_plugins()) do
if plugin.dependencies then if plugin.dependencies then
vim.list_extend(candidates, plugin.dependencies) vim.list_extend(deps_in_unused, plugin.dependencies)
end end
end end
---@type table<string, boolean> ---@type table<string, boolean>
local seen = {} local seen = {}
-- filter: candidates that are not active -- filter: deps that are not active
-- filter: duplicate candidates -- filter: duplicate deps
return vim.tbl_filter(function(candidate) return vim.tbl_filter(function(name)
if not self.plugins[candidate] or seen[candidate] then if not self.plugins[name] or seen[name] then
return false return false
end end
seen[candidate] = true seen[name] = true
return candidate return name
end, candidates) end, deps_in_unused)
end end
function Spec:fix_active() function Spec:fix_active()
-- merge again without instance contributions by unused plugins ---@type string[]
local dirty_plugins = self:collect_dirty() local names = self:names_to_repair()
for _, plugin_name in pairs(dirty_plugins) do
local filtered_instances = vim.tbl_filter(function(instance) -- merge again without contributions from unused plugins
if instance._.parent_name and not self.plugins[instance._.parent_name] then for _, name in pairs(names) do
---@type LazyPlugin[]
local filtered_contributions = vim.tbl_filter(function(contr)
if contr._.parent_name and not self.plugins[contr._.parent_name] then
return false return false
end end
return instance return contr
end, self.repair_info[plugin_name]) end, self.repair_info[name])
self.plugins[plugin_name] = self:redo_merge(filtered_instances) self.plugins[name] = self:redo_merge(filtered_contributions)
end end
end end
---@param instances_of_plugin LazyPlugin[] ---@param contributions LazyPlugin[]
---@return LazyPlugin ---@return LazyPlugin
function Spec:redo_merge(instances_of_plugin) function Spec:redo_merge(contributions)
local last local last
for index, inst in ipairs(instances_of_plugin) do for index, inst in ipairs(contributions) do
if index == 1 then if index == 1 then
last = inst last = inst
else else
@ -205,7 +208,7 @@ function Spec:add(plugin, results, parent_name)
plugin._.dep = (parent_name ~= nil) or nil plugin._.dep = (parent_name ~= nil) or nil
plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, plugin.name) or nil plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, plugin.name) or nil
self:add_to_repair_info(plugin, parent_name) self:add_repair_info(plugin, parent_name)
if self.plugins[plugin.name] then if self.plugins[plugin.name] then
plugin = self:merge(self.plugins[plugin.name], plugin) plugin = self:merge(self.plugins[plugin.name], plugin)
end end
@ -218,8 +221,8 @@ end
---@param plugin LazyPlugin ---@param plugin LazyPlugin
---@param parent_name? string ---@param parent_name? string
function Spec:add_to_repair_info(plugin, parent_name) function Spec:add_repair_info(plugin, parent_name)
local copy = vim.deepcopy(plugin) -- copy the instance of the plugin local copy = vim.deepcopy(plugin) -- copy this plugin contribution
copy._.parent_name = parent_name copy._.parent_name = parent_name
self.repair_info[copy.name] = self.repair_info[copy.name] or {} self.repair_info[copy.name] = self.repair_info[copy.name] or {}
table.insert(self.repair_info[copy.name], copy) table.insert(self.repair_info[copy.name], copy)
@ -283,8 +286,7 @@ function Spec:fix_optional()
-- handle optional plugins -- handle optional plugins
for _, plugin in pairs(self.plugins) do for _, plugin in pairs(self.plugins) do
if plugin.optional and all_optional(plugin) then if plugin.optional and all_optional(plugin) then
self.plugins[plugin.name] = nil self:move_to_optional_only(plugin)
self.optional_only[plugin.name] = plugin
if plugin.dependencies then if plugin.dependencies then
vim.list_extend(all_optional_deps, plugin.dependencies) vim.list_extend(all_optional_deps, plugin.dependencies)
end end
@ -294,6 +296,17 @@ function Spec:fix_optional()
return all_optional_deps return all_optional_deps
end end
function Spec:move_to_disabled(plugin)
plugin._.kind = "disabled"
self.plugins[plugin.name] = nil
self.disabled[plugin.name] = plugin
end
function Spec:move_to_optional_only(plugin)
self.plugins[plugin.name] = nil
self.optional_only[plugin.name] = plugin
end
function Spec:fix_disabled() function Spec:fix_disabled()
for _, plugin in pairs(self.plugins) do for _, plugin in pairs(self.plugins) do
if not plugin.name or not plugin.dir then if not plugin.name or not plugin.dir then
@ -320,9 +333,7 @@ function Spec:fix_disabled()
table.insert(dep_of[dep], plugin.name) table.insert(dep_of[dep], plugin.name)
end end
else else
plugin._.kind = "disabled" self:move_to_disabled(plugin)
self.plugins[plugin.name] = nil
self.disabled[plugin.name] = plugin
if plugin.dependencies then if plugin.dependencies then
vim.list_extend(disabled_deps, plugin.dependencies) vim.list_extend(disabled_deps, plugin.dependencies)
end end
@ -331,16 +342,11 @@ function Spec:fix_disabled()
-- fix deps of plugins that are completely optional -- fix deps of plugins that are completely optional
self:fix_dependencies(all_optional_deps, dep_of, function(dep_name) self:fix_dependencies(all_optional_deps, dep_of, function(dep_name)
local plugin = self.plugins[dep_name] self:move_to_optional_only(self.plugins[dep_name])
self.plugins[dep_name] = nil
self.optional_only[dep_name] = plugin
end) end)
-- fix deps of disabled plugins -- fix deps of disabled plugins
self:fix_dependencies(disabled_deps, dep_of, function(dep_name) self:fix_dependencies(disabled_deps, dep_of, function(dep_name)
local plugin = self.plugins[dep_name] self:move_to_disabled(self.plugins[dep_name])
plugin._.kind = "disabled"
self.plugins[plugin.name] = nil
self.disabled[plugin.name] = plugin
end) end)
end end