Skip to content

Commit

Permalink
perf(spec): more efficient merging of specs and added Plugin._.super
Browse files Browse the repository at this point in the history
  • Loading branch information
folke committed Jan 4, 2023
1 parent 6d46a30 commit bce0c6e
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 58 deletions.
47 changes: 22 additions & 25 deletions lua/lazy/core/plugin.lua
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ local Cache = require("lazy.core.cache")
---@class LazyCorePlugin
local M = {}

local list_merge = { "dependencies" }
vim.list_extend(list_merge, vim.tbl_values(Handler.types))

---@class LazySpecLoader
---@field plugins table<string, LazyPlugin>
---@field disabled table<string, LazyPlugin>
Expand Down Expand Up @@ -99,6 +102,7 @@ function Spec:add(plugin, results, is_dep)
self.plugins[plugin.name] = plugin
return results and table.insert(results, plugin.name)
else
-- FIXME: we should somehow merge when needed
plugin._.kind = "disabled"
self.disabled[plugin.name] = plugin
self.plugins[plugin.name] = nil
Expand Down Expand Up @@ -198,36 +202,29 @@ end
---@param new LazyPlugin
---@return LazyPlugin
function Spec:merge(old, new)
local is_dep = old._.dep and new._.dep

---@diagnostic disable-next-line: no-unknown
for k, v in pairs(new) do
if k == "_" then
elseif old[k] ~= nil and old[k] ~= v then
if Handler.types[k] then
local values = type(v) == "string" and { v } or v
vim.list_extend(values, type(old[k]) == "string" and { old[k] } or old[k])
---@diagnostic disable-next-line: no-unknown
old[k] = values
elseif k == "config" or k == "priority" then
old[k] = v
elseif k == "dependencies" then
for _, dep in ipairs(v) do
if not vim.tbl_contains(old[k], dep) then
table.insert(old[k], dep)
end
new._.dep = old._.dep and new._.dep

for _, prop in ipairs(list_merge) do
if new[prop] and old[prop] then
---@type any[]
local props = {}
---@diagnostic disable-next-line: no-unknown
for _, value in ipairs(old[prop]) do
props[#props + 1] = value
end
---@diagnostic disable-next-line: no-unknown
for _, value in ipairs(new[prop]) do
if not vim.tbl_contains(props, value) then
props[#props + 1] = value
end
else
old[k] = v
self:warn("Overwriting key `" .. k .. "`\n" .. vim.inspect({ old = old, new = new }))
end
else
---@diagnostic disable-next-line: no-unknown
old[k] = v
new[prop] = props
end
end
old._.dep = is_dep
return old
new._.super = old
setmetatable(new, { __index = old })
return new
end

function M.update_state()
Expand Down
86 changes: 53 additions & 33 deletions lua/lazy/health.lua
Original file line number Diff line number Diff line change
Expand Up @@ -31,41 +31,10 @@ function M.check()
vim.health.report_ok("packer_compiled.lua not found")
end

local valid = {
1,
"name",
"url",
"enabled",
"lazy",
"dev",
"dependencies",
"init",
"config",
"build",
"branch",
"tag",
"commit",
"version",
"module",
"pin",
"cmd",
"event",
"keys",
"ft",
"dir",
"priority",
"cond",
"_",
}
local spec = Config.spec
for _, plugin in pairs(spec.plugins) do
for key in pairs(plugin) do
if not vim.tbl_contains(valid, key) then
if key ~= "module" or type(plugin.module) ~= "boolean" then
vim.health.report_warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">")
end
end
end
M.check_valid(plugin)
M.check_override(plugin)
end
if #spec.notifs > 0 then
vim.health.report_error("Issues were reported when loading your specs:")
Expand All @@ -82,4 +51,55 @@ function M.check()
end
end

---@param plugin LazyPlugin
function M.check_valid(plugin)
for key in pairs(plugin) do
if not vim.tbl_contains(M.valid, key) then
if key ~= "module" or type(plugin.module) ~= "boolean" then
vim.health.report_warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">")
end
end
end
end

---@param plugin LazyPlugin
function M.check_override(plugin)
if not plugin._.super then
return
end

for key, value in pairs(plugin._.super) do
if key ~= "_" and plugin[key] and plugin[key] ~= value then
vim.health.report_warn("{" .. plugin.name .. "}: overriding <" .. key .. ">")
end
end
end

M.valid = {
1,
"name",
"url",
"enabled",
"lazy",
"dev",
"dependencies",
"init",
"config",
"build",
"branch",
"tag",
"commit",
"version",
"module",
"pin",
"cmd",
"event",
"keys",
"ft",
"dir",
"priority",
"cond",
"_",
}

return M
1 change: 1 addition & 0 deletions lua/lazy/types.lua
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
---@field kind? LazyPluginKind
---@field dep? boolean True if this plugin is only in the spec as a dependency
---@field cond? boolean
---@field super? LazyPlugin

---@class LazyPluginHooks
---@field init? fun(LazyPlugin) Will always be run
Expand Down

0 comments on commit bce0c6e

Please sign in to comment.