48 lines
1.7 KiB
Lua
48 lines
1.7 KiB
Lua
local textmate = require("tests.utils.textmate")
|
|
local neogen = require("neogen")
|
|
|
|
local M = {}
|
|
|
|
--- Make a docstring for given language and return the `neogen` result.
|
|
---@param source string Pseudo-source-code to call. It contains `"|cursor|"` which is the expected user position.
|
|
---@param filetype string Buffer filetype.
|
|
---@param neogen_opts table? Custom Neogen opts passed during generate command.
|
|
---@return string? # The same source code, after calling neogen.
|
|
function M.make_docstring(source, filetype, neogen_opts)
|
|
local result = textmate.extract_cursors(source)
|
|
|
|
if not result then
|
|
vim.notify(
|
|
string.format("Source\n\n%s\n\nwas not parsable. Does it have a |cursor| defined?", source),
|
|
vim.log.levels.ERROR
|
|
)
|
|
|
|
return nil
|
|
end
|
|
|
|
local cursors, code = unpack(result)
|
|
|
|
local buffer = vim.api.nvim_create_buf(true, true)
|
|
vim.bo[buffer].filetype = filetype
|
|
vim.cmd.buffer(buffer)
|
|
local window = vim.fn.win_getid() -- We just created the buffer so the current window works
|
|
|
|
local strict_indexing = false
|
|
vim.api.nvim_buf_set_lines(buffer, 0, -1, strict_indexing, vim.fn.split(code, "\n"))
|
|
|
|
-- IMPORTANT: Because we are adding docstrings in the buffer, we must start
|
|
-- from the bottom docstring up. Otherwise the row/column positions of the
|
|
-- next `cursor` in `cursors` will be out of date.
|
|
for index = #cursors, 1, -1 do
|
|
local cursor = cursors[index]
|
|
vim.api.nvim_win_set_cursor(window, cursor)
|
|
|
|
neogen_opts = vim.tbl_deep_extend("force", { snippet_engine = "nvim" }, neogen_opts or {})
|
|
neogen.generate(neogen_opts)
|
|
end
|
|
|
|
return table.concat(vim.api.nvim_buf_get_lines(buffer, 0, -1, strict_indexing), "\n")
|
|
end
|
|
|
|
return M
|