perf: cache handler groups

This commit is contained in:
Folke Lemaitre 2022-11-26 22:04:32 +01:00
parent 05a0da532b
commit 42c2fb42c8
No known key found for this signature in database
GPG Key ID: 41F8B1FBACAE2040
3 changed files with 40 additions and 40 deletions

View File

@ -3,32 +3,39 @@ local Loader = require("lazy.core.loader")
local M = {} local M = {}
---@alias LazyHandler fun(plugins:LazyPlugin[]) ---@alias LazyHandler fun(grouped:table<string, string[]>)
---@type table<string, table<string, string[]>>
M._groups = nil
---@param plugins LazyPlugin[] ---@param plugins LazyPlugin[]
---@param key string ---@param rebuild? boolean
---@return table<any, LazyPlugin[]> function M.group(plugins, rebuild)
function M.group(plugins, key) if M._groups == nil or rebuild then
---@type table<any, LazyPlugin[]> M._groups = {}
local ret = {} local types = vim.tbl_keys(M.handlers) --[[@as string[] ]]
for _, key in ipairs(types) do
M._groups[key] = {}
for _, plugin in pairs(plugins) do for _, plugin in pairs(plugins) do
if plugin[key] then
---@diagnostic disable-next-line: no-unknown ---@diagnostic disable-next-line: no-unknown
for _, value in pairs(type(plugin[key]) == "table" and plugin[key] or { plugin[key] }) do for _, value in pairs(type(plugin[key]) == "table" and plugin[key] or { plugin[key] }) do
ret[value] = ret[value] or {} M._groups[key][value] = M._groups[key][value] or {}
table.insert(ret[value], plugin) table.insert(M._groups[key][value], plugin.name)
end end
end end
return ret end
end
end
return M._groups
end end
---@type table<string, LazyHandler> ---@type table<string, LazyHandler>
M.handlers = {} M.handlers = {}
---@param plugins LazyPlugin[] function M.handlers.event(grouped)
function M.handlers.event(plugins)
local group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) local group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true })
---@diagnostic disable-next-line: redefined-local for event, plugins in pairs(grouped) do
for event, plugins in pairs(M.group(plugins, "event")) do
---@cast event string ---@cast event string
if event == "VimEnter" and vim.v.vim_did_enter == 1 then if event == "VimEnter" and vim.v.vim_did_enter == 1 then
Loader.load(plugins, { event = event }) Loader.load(plugins, { event = event })
@ -48,9 +55,8 @@ function M.handlers.event(plugins)
end end
end end
function M.handlers.keys(plugins) function M.handlers.keys(grouped)
---@diagnostic disable-next-line: redefined-local for keys, plugins in pairs(grouped) do
for keys, plugins in pairs(M.group(plugins, "keys")) do
---@cast keys string ---@cast keys string
vim.keymap.set("n", keys, function() vim.keymap.set("n", keys, function()
vim.keymap.del("n", keys) vim.keymap.del("n", keys)
@ -62,10 +68,9 @@ function M.handlers.keys(plugins)
end end
end end
function M.handlers.ft(plugins) function M.handlers.ft(grouped)
local group = vim.api.nvim_create_augroup("lazy_handler_ft", { clear = true }) local group = vim.api.nvim_create_augroup("lazy_handler_ft", { clear = true })
---@diagnostic disable-next-line: redefined-local for ft, plugins in pairs(grouped) do
for ft, plugins in pairs(M.group(plugins, "ft")) do
---@cast ft string ---@cast ft string
vim.api.nvim_create_autocmd("FileType", { vim.api.nvim_create_autocmd("FileType", {
once = true, once = true,
@ -80,9 +85,8 @@ function M.handlers.ft(plugins)
end end
end end
function M.handlers.cmd(plugins) function M.handlers.cmd(grouped)
---@diagnostic disable-next-line: redefined-local for cmd, plugins in pairs(grouped) do
for cmd, plugins in pairs(M.group(plugins, "cmd")) do
---@cast cmd string ---@cast cmd string
local function _load(complete) local function _load(complete)
vim.api.nvim_del_user_command(cmd) vim.api.nvim_del_user_command(cmd)
@ -117,17 +121,16 @@ function M.handlers.cmd(plugins)
end end
end end
function M.handlers.module(plugins) function M.handlers.module(grouped)
local modules = M.group(plugins, "module")
---@param modname string ---@param modname string
table.insert(package.loaders, 2, function(modname) table.insert(package.loaders, 2, function(modname)
local idx = modname:find(".", 1, true) or #modname + 1 local idx = modname:find(".", 1, true) or #modname + 1
while idx do while idx do
local name = modname:sub(1, idx - 1) local name = modname:sub(1, idx - 1)
---@diagnostic disable-next-line: redefined-local ---@diagnostic disable-next-line: redefined-local
local plugins = modules[name] local plugins = grouped[name]
if plugins then if plugins then
modules[name] = nil grouped[name] = nil
local reason = { require = modname } local reason = { require = modname }
if #Loader.loading == 0 then if #Loader.loading == 0 then
local f = 3 local f = 3

View File

@ -8,20 +8,14 @@ M.loading = {}
function M.setup() function M.setup()
local Handler = require("lazy.core.handler") local Handler = require("lazy.core.handler")
local groups = Handler.group(Config.plugins)
for t, handler in pairs(Handler.handlers) do for t, handler in pairs(Handler.handlers) do
if groups[t] then
Util.track(t) Util.track(t)
---@type LazyPlugin[] handler(groups[t])
local plugins = {}
for _, plugin in pairs(Config.plugins) do
if plugin[t] ~= nil then
table.insert(plugins, plugin)
end
end
if #plugins > 0 then
handler(plugins)
end
Util.track() Util.track()
end end
end
end end
function M.init_plugins() function M.init_plugins()

View File

@ -207,6 +207,8 @@ function M.load()
if M.dirty then if M.dirty then
Cache.dirty = true Cache.dirty = true
elseif state then
require("lazy.core.handler")._groups = state.handlers
end end
end end
@ -215,6 +217,7 @@ function M.save()
local state = { local state = {
---@type table<string, LazySpec> ---@type table<string, LazySpec>
specs = {}, specs = {},
handlers = require("lazy.core.handler").group(Config.plugins, true),
config = Config.options, config = Config.options,
} }