refactor(ts): own parser installation, split from pack

This commit is contained in:
2026-04-20 22:50:16 +02:00
parent c7dd083083
commit 21f566112e
3 changed files with 201 additions and 212 deletions
+43 -76
View File
@@ -29,7 +29,6 @@ end
---@field name? string
---@field version? string | vim.VersionRange
---@field build? string[] | fun(self: ow.Pack.Plugin)
---@field ts_parser? ow.TS.ParserField
---@class ow.Pack.Plugin : ow.Pack.PluginSpec
---@field name string
@@ -89,7 +88,6 @@ local function to_pack_spec(spec)
version = spec.version,
data = {
build = spec.build,
ts_parser = spec.ts_parser,
},
}
end
@@ -112,14 +110,6 @@ local function run_build(plugin)
log.error("Invalid build parameter for %s", plugin.name)
end
---@param plugin ow.Pack.Plugin
local function run_ts_build(plugin)
local ts = require("ts")
for _, p in ipairs(ts.normalize(assert(plugin.ts_parser))) do
ts.build(plugin, p)
end
end
---@class ow.Pack.Event.Data
---@field active boolean
---@field kind "install" | "update" | "delete"
@@ -129,28 +119,6 @@ end
---@class ow.Pack.Event : vim.api.keyset.create_autocmd.callback_args
---@field data ow.Pack.Event.Data
---@param plugin ow.Pack.Plugin
---@param events ow.Pack.Event[]
local function process_events(plugin, events)
if not plugin.build and not plugin.ts_parser then
return
end
for _, ev in ipairs(events) do
if
ev.data.spec.name == plugin.name
and ev.event == "PackChanged"
and (ev.data.kind == "install" or ev.data.kind == "update")
then
if plugin.ts_parser then
run_ts_build(plugin)
else
run_build(plugin)
end
end
end
end
---@type uv.uv_fs_event_t?
local watcher = nil
---@type ow.Util.KeyedDebounceHandle<string>?
@@ -237,56 +205,55 @@ function M.unwatch()
end
end
---@param specs (string | ow.Pack.PluginSpec)[]
function M.setup(specs)
---@type table<string, ow.Pack.Event[]?>
local events = {}
local group = vim.api.nvim_create_augroup("ow.Pack", { clear = true })
local id = vim.api.nvim_create_autocmd(
{ "PackChangedPre", "PackChanged" },
{
group = group,
---@param ev ow.Pack.Event
callback = function(ev)
local name = ev.data.spec.name
if not name then
return
end
if not events[name] then
events[name] = {}
end
table.insert(events[name], ev)
end,
}
)
vim.pack.add(vim.tbl_map(to_pack_spec, specs), {
load = function(data)
if not data.spec.name then
log.error("Missing name for plugin: %s", data.spec.src)
return
end
local d = data.spec.data or {}
---@type ow.Pack.Plugin
local plugin = {
[1] = data.spec.src,
name = data.spec.name,
version = data.spec.version,
build = d.build,
ts_parser = d.ts_parser,
path = data.path,
}
table.insert(M.plugins, plugin)
if not d.ts_parser then
vim.cmd.packadd(plugin.name)
---@param specs vim.pack.Spec[]
---@param on_load fun(data: { spec: vim.pack.Spec, path: string })
---@return table<string, true> changed names installed or updated during this call
function M.install(specs, on_load)
---@type table<string, true>
local changed = {}
local group =
vim.api.nvim_create_augroup("ow.Pack.install", { clear = true })
local id = vim.api.nvim_create_autocmd("PackChanged", {
group = group,
---@param ev ow.Pack.Event
callback = function(ev)
local name = ev.data.spec.name
if
name
and (ev.data.kind == "install" or ev.data.kind == "update")
then
changed[name] = true
end
end,
})
vim.pack.add(specs, { load = on_load })
vim.api.nvim_del_autocmd(id)
return changed
end
---@param specs (string | ow.Pack.PluginSpec)[]
function M.setup(specs)
local changed = M.install(vim.tbl_map(to_pack_spec, specs), function(data)
if not data.spec.name then
log.error("Missing name for plugin: %s", data.spec.src)
return
end
local d = data.spec.data or {}
---@type ow.Pack.Plugin
local plugin = {
[1] = data.spec.src,
name = data.spec.name,
version = data.spec.version,
build = d.build,
path = data.path,
}
table.insert(M.plugins, plugin)
vim.cmd.packadd(plugin.name)
end)
for _, plugin in ipairs(M.plugins) do
local ev = events[plugin.name]
if ev then
process_events(plugin, ev)
if plugin.build and changed[plugin.name] then
run_build(plugin)
end
load(plugin.name, false)
end