Compare commits

...

3 commits

Author SHA1 Message Date
c12891f7ea
style(compiler): reformat long condition for stylua 2026-03-04 00:20:10 -05:00
Barrett Ruth
88dc47b643
Merge branch 'main' into fix/compiler-longrunning-open 2026-03-04 00:17:17 -05:00
Barrett Ruth
54ef0c3c99
fix(compiler): guard active entry before clearing in process callback (#22)
* fix(compiler): guard active entry before clearing in process callback

Problem: when M.compile() is called while a previous process is still
running, the old process's vim.schedule_wrap callback unconditionally
sets active[bufnr] = nil, wiping the new process from the tracking
table. status() incorrectly returns idle and stop() becomes a no-op
against the still-running process.

Solution: capture obj as an upvalue in each callback and only clear
active[bufnr] if it still points to the same process object.

* fix(compiler): hoist obj declaration before vim.system closure

Problem: lua-language-server flagged obj as an undefined global in
both vim.schedule_wrap callbacks because local obj = vim.system(...)
puts the variable out of scope inside the closure at declaration time.
At runtime the guard active[bufnr].obj == obj evaluated obj as nil,
so the clear was always skipped and the process remained tracked
indefinitely.

Solution: split into local obj / obj = vim.system(...) so the
upvalue is in scope when the closure is defined.
2026-03-04 00:17:10 -05:00

View file

@ -91,14 +91,17 @@ function M.compile(bufnr, name, provider, ctx)
table.concat(reload_cmd, ' ')
)
local obj = vim.system(
local obj
obj = vim.system(
reload_cmd,
{
cwd = cwd,
env = provider.env,
},
vim.schedule_wrap(function(result)
active[bufnr] = nil
if active[bufnr] and active[bufnr].obj == obj then
active[bufnr] = nil
end
if not vim.api.nvim_buf_is_valid(bufnr) then
return
end
@ -144,7 +147,12 @@ function M.compile(bufnr, name, provider, ctx)
end)
)
if provider.open and not opened[bufnr] and output_file ~= '' and vim.uv.fs_stat(output_file) then
if
provider.open
and not opened[bufnr]
and output_file ~= ''
and vim.uv.fs_stat(output_file)
then
if provider.open == true then
vim.ui.open(output_file)
elseif type(provider.open) == 'table' then
@ -180,14 +188,17 @@ function M.compile(bufnr, name, provider, ctx)
log.dbg('compiling buffer %d with provider "%s": %s', bufnr, name, table.concat(cmd, ' '))
local obj = vim.system(
local obj
obj = vim.system(
cmd,
{
cwd = cwd,
env = provider.env,
},
vim.schedule_wrap(function(result)
active[bufnr] = nil
if active[bufnr] and active[bufnr].obj == obj then
active[bufnr] = nil
end
if not vim.api.nvim_buf_is_valid(bufnr) then
return
end