You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go.nvim/lua/go/tags.lua

102 lines
3.0 KiB
Lua

local utils = require("go.utils")
local tags = {}
-- support -add-tags, --add-options, -remove-tags, -remove-options, clear-tags, clear-options
-- for struct and line range
-- gomodifytags -file demo.go -struct Server -add-tags json
-- gomodifytags -file demo.go -struct Server -add-tags json -w
-- gomodifytags -file demo.go -struct Server -add-tags json,xml
-- gomodifytags -file demo.go -struct Server -add-tags json,xml -transform camelcase
-- gomodifytags -file demo.go -line 8,11 -clear-tags xml
local gomodify = "gomodifytags"
local transform = _GO_NVIM_CFG.tag_transform
tags.modify = function(...)
require("go.install").install(gomodify)
local fname = vim.fn.expand("%") -- %:p:h ? %:p
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
local ns = require("go.ts.go").get_struct_node_at_pos(row, col)
if utils.empty(ns) then
return
end
-- vim.notify("parnode" .. vim.inspect(ns), vim.lsp.log_levels.DEBUG)
local struct_name = ns.name
local setup = { gomodify, "-format", "json", "-file", fname, "-w" }
if struct_name == nil then
local _, csrow, _, _ = unpack(vim.fn.getpos("."))
table.insert(setup, "-line")
table.insert(setup, csrow)
else
table.insert(setup, "-struct")
table.insert(setup, struct_name)
end
if transform then
table.insert(setup, "-transform")
table.insert(setup, transform)
end
local arg = { ... }
for _, v in ipairs(arg) do
table.insert(setup, v)
end
if #arg == 1 and arg[1] ~= "-clear-tags" then
table.insert(setup, "json")
end
-- vim.notify(vim.inspect(setup), vim.lsp.log_levels.DEBUG)
vim.fn.jobstart(setup, {
on_stdout = function(_, data, _)
data = utils.handle_job_data(data)
if not data then
return
end
local tagged = vim.fn.json_decode(data)
-- vim.notify(vim.inspect(tagged), vim.lsp.log_levels.DEBUG)
-- vim.notify(tagged["start"] .. " " .. tagged["end"] .. " " .. tagged.lines, vim.lsp.log_levels.ERROR)
if tagged.errors ~= nil or tagged.lines == nil or tagged["start"] == nil or tagged["start"] == 0 then
vim.notify("failed to set tags" .. vim.inspect(tagged), vim.lsp.log_levels.ERROR)
end
for index, value in ipairs(tagged.lines) do
tagged.lines[index] = utils.rtrim(value)
end
-- trim tail spaces?
vim.api.nvim_buf_set_lines(0, tagged["start"] - 1, tagged["start"] - 1 + #tagged.lines, false, tagged.lines)
vim.cmd("write")
vim.notify("struct updated ", vim.lsp.log_levels.DEBUG)
end,
})
end
tags.add = function(...)
local cmd = { "-add-tags" }
local arg = { ... }
if #arg == 0 then
arg = { "json" }
end
for _, v in ipairs(arg) do
table.insert(cmd, v)
end
tags.modify(unpack(cmd))
end
tags.rm = function(...)
local cmd = { "-remove-tags" }
local arg = { ... }
if #arg == 0 then
arg = { "json" }
end
for _, v in ipairs(arg) do
table.insert(cmd, v)
end
tags.modify(unpack(cmd))
end
tags.clear = function()
local cmd = { "-clear-tags" }
tags.modify(unpack(cmd))
end
return tags