refine module support and package loading

This commit is contained in:
2025-06-24 01:48:30 -04:00
parent eba21a8021
commit 6bd6db3c02
6 changed files with 200 additions and 101 deletions

35
lua/dep/bench.lua Normal file
View File

@ -0,0 +1,35 @@
-- TODO: actually use this (ideally make a view that shows startuptime and
-- which plugins are currently loaded)
-- performance logging
---@class bench
---@field perf number[] list of all perfs
local bench = {}
local b
function bench:setup()
local o = {}
self = {}
self.__index = self
setmetatable(o, self)
o.perf = {}
o.inited = true
b = o
end
--- benchmark a peice of code
---@param name string the name of the benchmark
---@param f function the code to benchmark
---@vararg any args for f
---@return any ret the result of f
function bench.mark(name, f, ...)
local start = os.clock()
local ret = f(...)
b.perf[name] = os.clock() - start
return ret
end
return bench

39
lua/dep/modules/init.lua Normal file
View File

@ -0,0 +1,39 @@
local module = require("dep.modules.module")
---@class modules
---@field modules module[] all modules in dep
local modules = {}
--- Initialize all the modules
---@param self table?
---@param speclist table
---@param overrides spec? overrides
---@return modules modules manager
---@nodisacard
function modules:setup(speclist, overrides)
overrides = overrides or {}
local o = {}
self = {}
self.__index = self
setmetatable(o, self)
-- create a list of modules
o.modules = {}
-- loop through all modules and initialize them
for _, modpath in ipairs(speclist.modules) do
local mod = module.new(
nil,
modpath,
speclist.modules.prefix,
overrides
)
table.insert(o.modules, mod)
end
return self
end
return modules

View File

@ -0,0 +1,55 @@
local spec_man = require("dep.spec")
local packager = require("dep.package")
---@class module
---@field name string name of the module
---@field path string path to the module
---@field mod table the module
local module = {}
--- Initialize a module
---@param self table?
---@param modpath string path to the module
---@param prefix string? the prefix to all modules
---@param overrides spec? a module override
---@return module|false module false on failure to load module
---@nodiscard
function module:new(modpath, prefix, overrides)
local ok, err
local o = {}
self = {}
self.__index = self
setmetatable(o, self)
o.name = "<unnamed module>"
if type(modpath) == "string" then
if prefix ~= nil then
if prefix:sub(#prefix) ~= "." and modpath:sub(1, 2) ~= "." then
modpath = "."..modpath
end
o.path = prefix..modpath
else
o.path = modpath
end
o.name = modpath
ok, o.mod = pcall(require, o.path)
if not ok then
return false
end
end
o.name = o.mod.name or o.name
-- allow a module to be a spec
if spec_man.check(o.mod, true) ~= false then
o.mod = { o.mod }
end
ok, err = pcall(packager.register_speclist, o.mod, overrides)
if not ok then
error(string.format("%s <- %s", err, o.name))
end
return self
end
return module

View File

@ -1,5 +1,6 @@
local logger = require('dep.log')
local spec_man = require("dep.spec")
local bench = require("dep.bench")
---@class package
---@field id string id of the package
@ -443,4 +444,51 @@ function package.findcycle(pkgs)
return false
end
--- recurse over all packages and register them
---@param speclist speclist table of specs
---@param overrides spec? a package spec that is used to override options
function package.register_speclist(speclist, overrides)
overrides = overrides or {}
-- recurse the packages
local over = overrides
for _, spec in ipairs(speclist) do
-- make sure the overrides override and take into account the packages spec
---@diagnostic disable-next-line: missing-fields
over = {
pin = overrides.pin or spec.pin,
disable = overrides.disable or spec.disable
}
-- While a package can fail to load we just don't care, it will work itself
-- out. The goal is to make sure every plugin that can load does load, not
-- keep working plugins from loading because an unrelated one doesn't load.
package:new(spec, over)
end
end
--- reload the package
---@param self package the package to reload
---@param force boolean? force all packages to load
function package:reload(force)
local reloaded = self:loadtree(force)
if reloaded then
local ok, err
-- TODO: make a benchmark function
bench.mark("reload", function()
ok, err = pcall(vim.cmd,
[[
silent! helptags ALL
silent! UpdateRemotePlugins
]])
end)
if not ok then
logger:log("error",
"failed to reload helptags and remote plugins; reason: %s", err)
end
end
end
return package

View File

@ -1,11 +1,11 @@
local logger = require("dep.log")
---@class modules
---@class specmodules
---@field prefix string prefix to prepend to the modules
---@field [integer] string list of all modules to load
---@class speclist
---@field modules modules a list of modules
---@field modules specmodules a list of modules
---@field [integer] spec a spec
---@class spec
@ -53,6 +53,8 @@ function spec:correct_spec()
repeat
if type(self[1]) ~= "string" then
self = self[1]
elseif self[1] == nil then
break
end
until type(self[1]) == "string"
end