2021-07-14 13:58:31 +00:00
|
|
|
local bind = require("go.keybind")
|
2021-07-10 11:06:10 +00:00
|
|
|
local map_cr = bind.map_cr
|
2021-12-16 22:02:29 +00:00
|
|
|
local utils = require("go.utils")
|
2021-08-30 06:37:36 +00:00
|
|
|
local log = utils.log
|
2021-12-16 22:02:29 +00:00
|
|
|
local sep = "." .. utils.sep()
|
2022-03-07 06:09:42 +00:00
|
|
|
local getopt = require("go.alt_getopt")
|
2022-06-30 05:34:48 +00:00
|
|
|
local dapui_setuped
|
2022-07-01 10:30:43 +00:00
|
|
|
local keys = {}
|
2022-03-07 06:09:42 +00:00
|
|
|
local long_opts = {
|
|
|
|
compile = "c",
|
|
|
|
run = "r",
|
2022-04-16 12:09:15 +00:00
|
|
|
attach = "a",
|
2022-03-07 06:09:42 +00:00
|
|
|
test = "t",
|
|
|
|
restart = "R",
|
2022-04-16 12:09:15 +00:00
|
|
|
stop = "s",
|
2022-03-07 06:09:42 +00:00
|
|
|
help = "h",
|
|
|
|
nearest = "n",
|
2022-04-16 12:09:15 +00:00
|
|
|
package = "p",
|
2022-03-07 06:09:42 +00:00
|
|
|
file = "f",
|
|
|
|
breakpoint = "b",
|
|
|
|
tag = "T",
|
|
|
|
}
|
2022-04-16 12:09:15 +00:00
|
|
|
local opts = "tcraRsnpfsbhT:"
|
2022-03-07 06:09:42 +00:00
|
|
|
local function help()
|
|
|
|
return "Usage: GoDebug [OPTION]\n"
|
|
|
|
.. "Options:\n"
|
2022-06-30 02:41:20 +00:00
|
|
|
.. " -c, --compile compile\n"
|
2022-03-07 06:09:42 +00:00
|
|
|
.. " -r, --run run\n"
|
|
|
|
.. " -t, --test run tests\n"
|
|
|
|
.. " -R, --restart restart\n"
|
2022-04-16 12:09:15 +00:00
|
|
|
.. " -s, --stop stop\n"
|
2022-03-07 06:09:42 +00:00
|
|
|
.. " -h, --help display this help and exit\n"
|
2022-04-16 12:09:15 +00:00
|
|
|
.. " -n, --nearest debug nearest file\n"
|
|
|
|
.. " -p, --package debug package\n"
|
2022-03-07 06:09:42 +00:00
|
|
|
.. " -f, --file display file\n"
|
2022-06-30 02:41:20 +00:00
|
|
|
.. " -b, --breakpoint set breakpoint"
|
2022-03-07 06:09:42 +00:00
|
|
|
end
|
2021-11-10 02:20:54 +00:00
|
|
|
|
2022-06-30 02:41:20 +00:00
|
|
|
-- not sure if anyone still use telescope for debug
|
2021-07-10 11:06:10 +00:00
|
|
|
local function setup_telescope()
|
2021-12-16 22:02:29 +00:00
|
|
|
require("telescope").setup()
|
|
|
|
require("telescope").load_extension("dap")
|
2021-07-10 11:06:10 +00:00
|
|
|
local ts_keys = {
|
2022-07-01 10:30:43 +00:00
|
|
|
["n|lb"] = '<cmd>lua require"telescope".extensions.dap.list_breakpoints{}',
|
|
|
|
["n|tv"] = '<cmd>lua require"telescope".extensions.dap.variables{}',
|
|
|
|
["n|bt"] = '<cmd>lua require"telescope".extensions.dap.frames{}',
|
2021-07-10 11:06:10 +00:00
|
|
|
}
|
|
|
|
bind.nvim_load_mapping(ts_keys)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function keybind()
|
2021-12-16 22:02:29 +00:00
|
|
|
if not _GO_NVIM_CFG.dap_debug_keymap then
|
|
|
|
return
|
|
|
|
end
|
2022-07-01 10:30:43 +00:00
|
|
|
keys = {
|
2021-07-10 11:06:10 +00:00
|
|
|
-- DAP --
|
|
|
|
-- run
|
2022-07-01 10:30:43 +00:00
|
|
|
["n|r"] = '<cmd>lua require"go.dap".run()',
|
|
|
|
["n|c"] = '<cmd>lua require"dap".continue()',
|
|
|
|
["n|n"] = '<cmd>lua require"dap".step_over()',
|
|
|
|
["n|s"] = '<cmd>lua require"dap".step_into()',
|
|
|
|
["n|o"] = '<cmd>lua require"dap".step_out()',
|
|
|
|
["n|S"] = '<cmd>lua require"go.dap".stop()',
|
|
|
|
["n|u"] = '<cmd>lua require"dap".up()',
|
|
|
|
["n|D"] = '<cmd>lua require"dap".down()',
|
|
|
|
["n|C"] = '<cmd>lua require"dap".run_to_cursor()',
|
|
|
|
["n|b"] = '<cmd>lua require"dap".toggle_breakpoint()',
|
|
|
|
["n|P"] = '<cmd>lua require"dap".pause()',
|
2021-07-10 11:06:10 +00:00
|
|
|
--
|
|
|
|
}
|
2021-11-23 23:13:40 +00:00
|
|
|
if _GO_NVIM_CFG.dap_debug_gui then
|
2022-07-01 10:30:43 +00:00
|
|
|
keys["n|p"] = '<cmd>lua require("dapui").eval()'
|
|
|
|
keys["v|p"] = '<cmd>lua require("dapui").eval()'
|
|
|
|
keys["n|K"] = '<cmd>lua require("dapui").float_element()'
|
|
|
|
keys["n|B"] = '<cmd>lua require("dapui").float_element("breakpoints")'
|
|
|
|
keys["n|R"] = '<cmd>lua require("dapui").float_element("repl")'
|
|
|
|
keys["n|O"] = '<cmd>lua require("dapui").float_element("scopes")'
|
|
|
|
keys["n|a"] = '<cmd>lua require("dapui").float_element("stacks")'
|
|
|
|
keys["n|w"] = '<cmd>lua require("dapui").float_element("watches")'
|
2021-11-23 23:13:40 +00:00
|
|
|
else
|
2022-07-01 10:30:43 +00:00
|
|
|
keys["n|p"] = '<cmd>lua require"dap.ui.widgets".hover()'
|
|
|
|
keys["v|p"] = '<cmd>lua require"dap.ui.widgets".hover()'
|
2021-11-23 23:13:40 +00:00
|
|
|
end
|
2021-07-10 11:06:10 +00:00
|
|
|
bind.nvim_load_mapping(keys)
|
|
|
|
end
|
|
|
|
|
2021-10-24 23:05:02 +00:00
|
|
|
local function get_build_flags()
|
2022-06-15 04:11:10 +00:00
|
|
|
local get_build_tags = require("go.gotest").get_build_tags
|
|
|
|
local tags = get_build_tags({})
|
|
|
|
if tags then
|
|
|
|
return tags
|
2021-10-24 23:05:02 +00:00
|
|
|
else
|
|
|
|
return ""
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-07-10 11:06:10 +00:00
|
|
|
local M = {}
|
|
|
|
|
2022-07-01 10:30:43 +00:00
|
|
|
function M.debug_keys()
|
|
|
|
local keymap_help = {}
|
|
|
|
for key, val in pairs(keys) do
|
|
|
|
|
|
|
|
local m = vim.fn.matchlist(val, [[\v(\p+)\.(\p+\(\p*\))]]) -- match last function e.g.float_element("repl")
|
|
|
|
|
|
|
|
table.insert(keymap_help, key .. " -> " .. m[3])
|
|
|
|
end
|
|
|
|
|
|
|
|
local guihua = utils.load_plugin("guihua.lua", "guihua.listview")
|
|
|
|
|
|
|
|
if guihua then
|
|
|
|
local ListView = require("guihua.listview")
|
|
|
|
return ListView:new({
|
|
|
|
loc = "top_center",
|
|
|
|
border = "none",
|
|
|
|
prompt = true,
|
|
|
|
enter = true,
|
|
|
|
rect = { height = 20, width = 50 },
|
|
|
|
data = keymap_help,
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local close_events = { "CursorMoved", "CursorMovedI", "BufHidden", "InsertCharPre" }
|
|
|
|
local config = { close_events = close_events, focusable = true, border = "single" }
|
|
|
|
vim.lsp.util.open_floating_preview(keymap_help, "lua", config)
|
|
|
|
end
|
|
|
|
|
2021-07-10 11:06:10 +00:00
|
|
|
M.prepare = function()
|
2021-12-16 22:02:29 +00:00
|
|
|
utils.load_plugin("nvim-dap", "dap")
|
2022-04-16 12:09:15 +00:00
|
|
|
if _GO_NVIM_CFG.icons ~= false then
|
|
|
|
vim.fn.sign_define("DapBreakpoint", {
|
|
|
|
text = _GO_NVIM_CFG.icons.breakpoint,
|
|
|
|
texthl = "",
|
|
|
|
linehl = "",
|
|
|
|
numhl = "",
|
|
|
|
})
|
|
|
|
vim.fn.sign_define("DapStopped", {
|
|
|
|
text = _GO_NVIM_CFG.icons.currentpos,
|
|
|
|
texthl = "",
|
|
|
|
linehl = "",
|
|
|
|
numhl = "",
|
|
|
|
})
|
|
|
|
end
|
2021-07-10 11:06:10 +00:00
|
|
|
if _GO_NVIM_CFG.dap_debug_gui then
|
2021-12-16 22:02:29 +00:00
|
|
|
utils.load_plugin("nvim-dap-ui", "dapui")
|
2022-06-30 05:34:48 +00:00
|
|
|
if dapui_setuped ~= true then
|
|
|
|
require("dapui").setup()
|
|
|
|
dapui_setuped = true
|
|
|
|
end
|
2022-03-07 06:09:42 +00:00
|
|
|
end
|
|
|
|
if _GO_NVIM_CFG.dap_debug_vt then
|
|
|
|
local vt = utils.load_plugin("nvim-dap-virtual-text")
|
|
|
|
vt.setup({ enabled_commands = true, all_frames = true })
|
2021-07-10 11:06:10 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
M.breakpt = function()
|
|
|
|
M.prepare()
|
2021-12-16 22:02:29 +00:00
|
|
|
require("dap").toggle_breakpoint()
|
2021-07-10 11:06:10 +00:00
|
|
|
end
|
|
|
|
|
2022-05-15 11:43:59 +00:00
|
|
|
M.save_brks = function()
|
|
|
|
M.prepare()
|
2022-05-13 15:07:44 +00:00
|
|
|
local bks = require("dap.breakpoints").get()
|
|
|
|
local all_bks = {}
|
|
|
|
if bks and next(bks) then
|
2022-06-01 11:29:13 +00:00
|
|
|
local _, fld = require("go.project").setup()
|
2022-05-13 15:07:44 +00:00
|
|
|
for bufnr, bk in pairs(bks) do
|
|
|
|
local uri = vim.uri_from_bufnr(bufnr)
|
2022-05-15 12:05:12 +00:00
|
|
|
local _bk = {}
|
2022-05-15 11:43:59 +00:00
|
|
|
for _, value in pairs(bk) do
|
2022-05-15 12:05:12 +00:00
|
|
|
table.insert(_bk, { line = value.line })
|
2022-05-15 11:43:59 +00:00
|
|
|
end
|
2022-05-15 12:05:12 +00:00
|
|
|
all_bks[uri] = _bk
|
2022-05-13 15:07:44 +00:00
|
|
|
end
|
|
|
|
local bkfile = fld .. utils.sep() .. "breakpoints.lua"
|
|
|
|
local writeStr = "return " .. vim.inspect(all_bks)
|
|
|
|
|
|
|
|
local writeLst = vim.split(writeStr, "\n")
|
|
|
|
|
|
|
|
vim.fn.writefile(writeLst, bkfile, "b")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-05-15 11:43:59 +00:00
|
|
|
M.load_brks = function()
|
2022-05-14 11:24:19 +00:00
|
|
|
M.prepare()
|
2022-05-15 04:09:07 +00:00
|
|
|
local _, brkfile = require("go.project").project_existed()
|
2022-05-14 11:24:19 +00:00
|
|
|
if vim.fn.filereadable(brkfile) == 0 then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
local f = assert(loadfile(brkfile))
|
|
|
|
local brks = f()
|
|
|
|
for uri, brk in pairs(brks) do
|
|
|
|
local bufnr = vim.uri_to_bufnr(uri)
|
|
|
|
if not vim.api.nvim_buf_is_loaded(bufnr) then
|
|
|
|
vim.fn.bufload(bufnr)
|
|
|
|
end
|
|
|
|
for index, lnum in ipairs(brk) do
|
|
|
|
require("dap.breakpoints").set({}, bufnr, lnum.line)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
M.clear_bks = function()
|
2022-05-13 15:07:44 +00:00
|
|
|
utils.load_plugin("nvim-dap", "dap")
|
2022-05-14 11:24:19 +00:00
|
|
|
|
|
|
|
require("dap.breakpoints").clear()
|
|
|
|
M.save_bks()
|
2022-05-15 04:09:07 +00:00
|
|
|
local _, brkfile = require("go.project").project_existed()
|
2022-05-13 15:07:44 +00:00
|
|
|
if vim.fn.filereadable(brkfile) == 0 then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
local f = assert(loadfile(brkfile))
|
|
|
|
local brks = f()
|
|
|
|
for uri, brk in pairs(brks) do
|
|
|
|
local bufnr = vim.uri_to_bufnr(uri)
|
|
|
|
if not vim.api.nvim_buf_is_loaded(bufnr) then
|
|
|
|
vim.fn.bufload(bufnr)
|
|
|
|
end
|
2022-06-01 11:29:13 +00:00
|
|
|
for _, lnum in ipairs(brk) do
|
2022-05-13 15:07:44 +00:00
|
|
|
require("dap.breakpoints").set({}, bufnr, lnum.line)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-06-30 05:34:48 +00:00
|
|
|
local function dapui_opened()
|
|
|
|
local lys = require("dapui.windows").layouts or {}
|
|
|
|
local opened = false
|
|
|
|
for _, ly in ipairs(lys) do
|
|
|
|
if ly:is_open() == true then
|
|
|
|
opened = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return opened
|
|
|
|
end
|
|
|
|
|
2022-04-20 02:00:49 +00:00
|
|
|
local stdout, stderr, handle
|
2021-07-10 11:06:10 +00:00
|
|
|
M.run = function(...)
|
2021-12-16 22:02:29 +00:00
|
|
|
local args = { ... }
|
2022-06-30 02:41:20 +00:00
|
|
|
local mode = "test"
|
2022-03-07 06:09:42 +00:00
|
|
|
|
|
|
|
local optarg, optind = getopt.get_opts(args, opts, long_opts)
|
|
|
|
log(optarg, optind)
|
|
|
|
|
|
|
|
if optarg["h"] then
|
|
|
|
return utils.info(help())
|
|
|
|
end
|
|
|
|
|
|
|
|
if optarg["c"] then
|
|
|
|
local fpath = vim.fn.expand("%:p:h")
|
|
|
|
local out = vim.fn.systemlist(table.concat({
|
|
|
|
"go",
|
|
|
|
"test",
|
|
|
|
"-v",
|
|
|
|
"-cover",
|
|
|
|
"-covermode=atomic",
|
|
|
|
"-coverprofile=cover.out",
|
|
|
|
"-tags " .. _GO_NVIM_CFG.build_tags,
|
|
|
|
"-c",
|
|
|
|
fpath,
|
|
|
|
}, " "))
|
|
|
|
if #out ~= 0 then
|
|
|
|
utils.info("building " .. vim.inspect(out))
|
|
|
|
end
|
|
|
|
return
|
|
|
|
end
|
2021-07-10 11:06:10 +00:00
|
|
|
|
2022-06-30 02:41:20 +00:00
|
|
|
if optarg["b"] then
|
|
|
|
return require("dap").toggle_breakpoint()
|
|
|
|
end
|
|
|
|
|
2022-01-16 23:31:24 +00:00
|
|
|
local guihua = utils.load_plugin("guihua.lua", "guihua.gui")
|
|
|
|
|
|
|
|
local original_select = vim.ui.select
|
|
|
|
if guihua then
|
|
|
|
vim.ui.select = require("guihua.gui").select
|
|
|
|
end
|
|
|
|
|
2022-01-12 22:07:14 +00:00
|
|
|
-- testopts = {"test", "nearest", "file", "stop", "restart"}
|
2022-04-16 12:09:15 +00:00
|
|
|
log("plugin loaded", mode, optarg)
|
|
|
|
|
|
|
|
if optarg["s"] and (optarg["t"] or optarg["r"]) then
|
|
|
|
M.stop(false)
|
|
|
|
elseif optarg["s"] then
|
|
|
|
return M.stop(true)
|
2021-11-24 09:05:02 +00:00
|
|
|
end
|
2021-11-29 20:19:45 +00:00
|
|
|
|
2022-03-07 06:09:42 +00:00
|
|
|
-- restart
|
|
|
|
if optarg["R"] then
|
2022-06-16 01:38:37 +00:00
|
|
|
M.stop(false)
|
2022-04-16 12:09:15 +00:00
|
|
|
if optarg["t"] then
|
|
|
|
mode = "test"
|
2022-01-12 22:07:14 +00:00
|
|
|
else
|
|
|
|
mode = M.pre_mode or "file"
|
|
|
|
end
|
2021-11-29 20:19:45 +00:00
|
|
|
else
|
|
|
|
M.pre_mode = mode
|
|
|
|
end
|
2022-01-12 22:07:14 +00:00
|
|
|
|
2022-01-15 09:59:03 +00:00
|
|
|
M.prepare()
|
2022-01-12 22:07:14 +00:00
|
|
|
local session = require("dap").session()
|
|
|
|
if session ~= nil and session.initialized == true then
|
2022-06-30 05:34:48 +00:00
|
|
|
if not optarg["R"] then
|
|
|
|
utils.info("debug session already started, press c to continue")
|
|
|
|
return
|
|
|
|
else
|
|
|
|
utils.info("debug session already started, press c to restart and stop the session")
|
|
|
|
end
|
2022-01-12 22:07:14 +00:00
|
|
|
end
|
2022-06-30 05:34:48 +00:00
|
|
|
|
2022-06-30 02:41:20 +00:00
|
|
|
local run_cur = optarg["r"] -- undocumented mode, smartrun current program in interactive mode
|
|
|
|
-- e.g. edit and run
|
2022-05-29 13:07:39 +00:00
|
|
|
local testfunc
|
2022-06-30 02:41:20 +00:00
|
|
|
|
2022-03-07 06:09:42 +00:00
|
|
|
if not run_cur then
|
|
|
|
keybind()
|
|
|
|
else
|
2022-06-30 02:41:20 +00:00
|
|
|
M.stop() -- rerun
|
2022-06-15 04:11:10 +00:00
|
|
|
testfunc = require("go.gotest").get_test_func_name()
|
2022-05-29 13:07:39 +00:00
|
|
|
if not string.find(testfunc.name, "[T|t]est") then
|
|
|
|
log("no test func found", testfunc.name)
|
2022-06-30 02:41:20 +00:00
|
|
|
testfunc = nil -- no test func avalible, run main
|
2022-05-29 13:07:39 +00:00
|
|
|
end
|
2022-03-07 06:09:42 +00:00
|
|
|
end
|
2022-01-12 22:07:14 +00:00
|
|
|
|
2022-03-07 06:09:42 +00:00
|
|
|
if _GO_NVIM_CFG.dap_debug_gui and not run_cur then
|
2022-06-30 05:34:48 +00:00
|
|
|
if dapui_opened() == false then
|
2022-01-12 22:07:14 +00:00
|
|
|
require("dapui").open()
|
|
|
|
end
|
2021-07-10 11:06:10 +00:00
|
|
|
end
|
2022-01-26 11:51:00 +00:00
|
|
|
|
2022-03-07 06:09:42 +00:00
|
|
|
local port = _GO_NVIM_CFG.dap_port
|
2022-01-30 05:02:18 +00:00
|
|
|
if _GO_NVIM_CFG.dap_port == nil or _GO_NVIM_CFG.dap_port == -1 then
|
2022-01-26 11:51:00 +00:00
|
|
|
math.randomseed(os.time())
|
|
|
|
port = 38000 + math.random(1, 1000)
|
|
|
|
end
|
2021-12-16 22:02:29 +00:00
|
|
|
local dap = require("dap")
|
2021-07-10 11:06:10 +00:00
|
|
|
dap.adapters.go = function(callback, config)
|
2022-04-20 02:00:49 +00:00
|
|
|
stdout = vim.loop.new_pipe(false)
|
|
|
|
stderr = vim.loop.new_pipe(false)
|
2021-07-10 11:06:10 +00:00
|
|
|
local pid_or_err
|
2022-03-07 06:09:42 +00:00
|
|
|
port = config.port or port
|
2022-01-26 11:51:00 +00:00
|
|
|
|
|
|
|
local host = config.host or "127.0.0.1"
|
|
|
|
|
|
|
|
local addr = string.format("%s:%d", host, port)
|
2022-04-20 02:00:49 +00:00
|
|
|
local function onread(err, data)
|
|
|
|
if err then
|
2022-05-29 13:07:39 +00:00
|
|
|
log(err, data)
|
2022-04-20 02:00:49 +00:00
|
|
|
-- print('ERROR: ', err)
|
|
|
|
vim.notify("dlv exited with code " + tostring(err), vim.lsp.log_levels.WARN)
|
|
|
|
end
|
|
|
|
if not data or data == "" then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if data:find("couldn't start") then
|
2022-06-30 02:41:20 +00:00
|
|
|
vim.schedule(function()
|
|
|
|
utils.error(data)
|
|
|
|
end)
|
2022-04-20 02:00:49 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
vim.schedule(function()
|
|
|
|
require("dap.repl").append(data)
|
|
|
|
end)
|
|
|
|
end
|
2022-02-14 04:59:31 +00:00
|
|
|
|
2021-07-10 11:06:10 +00:00
|
|
|
handle, pid_or_err = vim.loop.spawn("dlv", {
|
2022-04-20 02:00:49 +00:00
|
|
|
stdio = { nil, stdout, stderr },
|
2022-01-26 11:51:00 +00:00
|
|
|
args = { "dap", "-l", addr },
|
2021-12-16 22:02:29 +00:00
|
|
|
detached = true,
|
2021-07-10 11:06:10 +00:00
|
|
|
}, function(code)
|
2021-08-25 12:37:22 +00:00
|
|
|
if code ~= 0 then
|
2022-01-12 08:57:07 +00:00
|
|
|
vim.schedule(function()
|
2022-02-14 04:59:31 +00:00
|
|
|
log("Dlv exited", code)
|
2022-01-12 08:57:07 +00:00
|
|
|
vim.notify(string.format("Delve exited with exit code: %d", code), vim.lsp.log_levels.WARN)
|
2022-02-14 04:59:31 +00:00
|
|
|
if _GO_NVIM_CFG.dap_port ~= nil then
|
|
|
|
_GO_NVIM_CFG.dap_port = _GO_NVIM_CFG.dap_port + 1
|
|
|
|
end
|
2022-01-12 08:57:07 +00:00
|
|
|
end)
|
2021-08-25 12:37:22 +00:00
|
|
|
end
|
2022-02-14 04:59:31 +00:00
|
|
|
|
2022-07-01 09:06:02 +00:00
|
|
|
_ = stdout and stdout:close()
|
|
|
|
_ = stderr and stderr:close()
|
|
|
|
_ = handle and handle:close()
|
2022-04-20 02:00:49 +00:00
|
|
|
stdout = nil
|
|
|
|
stderr = nil
|
|
|
|
handle = nil
|
2021-08-25 12:37:22 +00:00
|
|
|
end)
|
|
|
|
assert(handle, "Error running dlv: " .. tostring(pid_or_err))
|
2022-04-20 02:00:49 +00:00
|
|
|
stdout:read_start(onread)
|
|
|
|
stderr:read_start(onread)
|
2022-03-07 06:09:42 +00:00
|
|
|
|
|
|
|
if not optarg["r"] then
|
2021-07-10 11:06:10 +00:00
|
|
|
dap.repl.open()
|
2022-03-07 06:09:42 +00:00
|
|
|
end
|
|
|
|
vim.defer_fn(function()
|
2022-01-26 11:51:00 +00:00
|
|
|
callback({ type = "server", host = host, port = port })
|
2022-05-29 13:07:39 +00:00
|
|
|
end, 1000)
|
2021-07-10 11:06:10 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local dap_cfg = {
|
|
|
|
type = "go",
|
|
|
|
name = "Debug",
|
|
|
|
request = "launch",
|
2021-10-24 23:05:02 +00:00
|
|
|
dlvToolPath = vim.fn.exepath("dlv"),
|
2021-12-16 22:02:29 +00:00
|
|
|
buildFlags = get_build_flags(),
|
2021-07-10 11:06:10 +00:00
|
|
|
}
|
2021-08-31 11:19:14 +00:00
|
|
|
|
|
|
|
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
|
|
|
|
row, col = row, col + 1
|
|
|
|
|
2021-12-29 14:33:24 +00:00
|
|
|
local empty = utils.empty
|
2022-05-29 13:07:39 +00:00
|
|
|
|
2022-01-15 09:59:03 +00:00
|
|
|
local launch = require("go.launch")
|
|
|
|
local cfg_exist, cfg_file = launch.vs_launch()
|
|
|
|
log(mode, cfg_exist, cfg_file)
|
2022-03-07 06:09:42 +00:00
|
|
|
|
|
|
|
-- if breakpoint is not set add breakpoint at current pos
|
|
|
|
local pts = require("dap.breakpoints").get()
|
2022-06-15 04:11:10 +00:00
|
|
|
if utils.empty(pts) then
|
2022-06-03 09:07:05 +00:00
|
|
|
require("dap").set_breakpoint()
|
2022-03-07 06:09:42 +00:00
|
|
|
end
|
|
|
|
|
2022-06-15 04:11:10 +00:00
|
|
|
testfunc = require("go.gotest").get_test_func_name()
|
2022-06-30 02:41:20 +00:00
|
|
|
log(testfunc)
|
2022-06-03 09:07:05 +00:00
|
|
|
|
|
|
|
if testfunc then
|
2022-06-30 02:41:20 +00:00
|
|
|
if testfunc.name ~= "main" then
|
|
|
|
optarg["t"] = true
|
|
|
|
end
|
2022-06-03 09:07:05 +00:00
|
|
|
end
|
2022-03-07 06:09:42 +00:00
|
|
|
if optarg["t"] then
|
2021-12-16 22:02:29 +00:00
|
|
|
dap_cfg.name = dap_cfg.name .. " test"
|
2021-07-10 11:06:10 +00:00
|
|
|
dap_cfg.mode = "test"
|
2022-02-14 04:59:31 +00:00
|
|
|
dap_cfg.request = "launch"
|
2021-11-10 02:20:54 +00:00
|
|
|
dap_cfg.program = sep .. "${relativeFileDirname}"
|
2022-06-02 09:07:28 +00:00
|
|
|
|
2022-05-29 13:07:39 +00:00
|
|
|
if testfunc then
|
|
|
|
dap_cfg.args = { "-test.run", "^" .. testfunc.name }
|
|
|
|
end
|
2021-12-16 22:02:29 +00:00
|
|
|
dap.configurations.go = { dap_cfg }
|
2021-07-10 13:53:33 +00:00
|
|
|
dap.continue()
|
2022-03-07 06:09:42 +00:00
|
|
|
elseif optarg["n"] then
|
2022-05-29 13:07:39 +00:00
|
|
|
local ns = require("go.ts.go").get_func_method_node_at_pos(row, col)
|
|
|
|
if empty(ns) then
|
|
|
|
log("ts not not found, debug while file")
|
|
|
|
end
|
2021-12-16 22:02:29 +00:00
|
|
|
dap_cfg.name = dap_cfg.name .. " test_nearest"
|
2021-08-31 11:19:14 +00:00
|
|
|
dap_cfg.mode = "test"
|
2022-02-14 04:59:31 +00:00
|
|
|
dap_cfg.request = "launch"
|
2021-11-10 02:20:54 +00:00
|
|
|
dap_cfg.program = sep .. "${relativeFileDirname}"
|
2022-06-15 04:11:10 +00:00
|
|
|
if not empty(ns) then
|
2022-05-29 13:07:39 +00:00
|
|
|
dap_cfg.args = { "-test.run", "^" .. ns.name }
|
|
|
|
end
|
2021-12-16 22:02:29 +00:00
|
|
|
dap.configurations.go = { dap_cfg }
|
2021-08-31 11:19:14 +00:00
|
|
|
dap.continue()
|
2022-03-07 06:09:42 +00:00
|
|
|
elseif optarg["a"] then
|
2022-02-14 04:59:31 +00:00
|
|
|
dap_cfg.name = dap_cfg.name .. " attach"
|
|
|
|
dap_cfg.mode = "local"
|
|
|
|
dap_cfg.request = "attach"
|
|
|
|
dap_cfg.processId = require("dap.utils").pick_process
|
|
|
|
dap.configurations.go = { dap_cfg }
|
|
|
|
dap.continue()
|
2022-03-07 06:09:42 +00:00
|
|
|
elseif optarg["p"] then
|
2022-02-14 04:59:31 +00:00
|
|
|
dap_cfg.name = dap_cfg.name .. " package"
|
2022-05-29 13:07:39 +00:00
|
|
|
dap_cfg.mode = "test"
|
2022-02-14 04:59:31 +00:00
|
|
|
dap_cfg.request = "launch"
|
|
|
|
dap_cfg.program = sep .. "${fileDirname}"
|
|
|
|
dap.configurations.go = { dap_cfg }
|
|
|
|
dap.continue()
|
2022-03-07 06:09:42 +00:00
|
|
|
elseif run_cur then
|
|
|
|
dap_cfg.name = dap_cfg.name .. " run current"
|
|
|
|
dap_cfg.request = "launch"
|
2022-05-29 13:07:39 +00:00
|
|
|
dap_cfg.mode = "debug"
|
|
|
|
dap_cfg.request = "launch"
|
|
|
|
if testfunc then
|
|
|
|
dap_cfg.args = { "-test.run", "^" .. testfunc.name }
|
|
|
|
dap_cfg.mode = "test"
|
|
|
|
end
|
2022-03-07 06:09:42 +00:00
|
|
|
dap_cfg.program = sep .. "${relativeFileDirname}"
|
|
|
|
dap.configurations.go = { dap_cfg }
|
|
|
|
dap.continue()
|
2022-05-29 13:07:39 +00:00
|
|
|
-- dap.run_to_cursor()
|
2022-01-15 09:59:03 +00:00
|
|
|
elseif cfg_exist then
|
2022-06-30 02:41:20 +00:00
|
|
|
log("using launch cfg")
|
2022-01-15 09:59:03 +00:00
|
|
|
launch.load()
|
2022-06-30 02:41:20 +00:00
|
|
|
log(dap.configurations.go)
|
2022-01-15 11:14:56 +00:00
|
|
|
for _, cfg in ipairs(dap.configurations.go) do
|
|
|
|
cfg.dlvToolPath = vim.fn.exepath("dlv")
|
|
|
|
end
|
2022-01-15 09:59:03 +00:00
|
|
|
dap.continue()
|
2022-06-30 02:41:20 +00:00
|
|
|
else -- no args
|
|
|
|
log("debug main")
|
2021-11-22 02:00:04 +00:00
|
|
|
dap_cfg.program = sep .. "${relativeFileDirname}"
|
2021-07-10 11:06:10 +00:00
|
|
|
dap_cfg.args = args
|
2022-06-30 02:41:20 +00:00
|
|
|
dap_cfg.mode = "debug"
|
2022-02-14 04:59:31 +00:00
|
|
|
dap_cfg.request = "launch"
|
2021-12-16 22:02:29 +00:00
|
|
|
dap.configurations.go = { dap_cfg }
|
2021-07-10 13:53:33 +00:00
|
|
|
dap.continue()
|
2021-07-10 11:06:10 +00:00
|
|
|
end
|
2022-06-30 02:41:20 +00:00
|
|
|
log(dap_cfg, args, optarg)
|
|
|
|
|
|
|
|
M.pre_mode = dap_cfg.mode or M.pre_mode
|
2022-01-16 23:31:24 +00:00
|
|
|
|
|
|
|
vim.ui.select = original_select
|
2021-07-10 11:06:10 +00:00
|
|
|
end
|
|
|
|
|
2021-11-29 20:19:45 +00:00
|
|
|
local unmap = function()
|
2021-12-16 22:02:29 +00:00
|
|
|
if not _GO_NVIM_CFG.dap_debug_keymap then
|
|
|
|
return
|
|
|
|
end
|
2021-11-23 23:13:40 +00:00
|
|
|
local keys = {
|
2021-12-16 22:02:29 +00:00
|
|
|
"r",
|
|
|
|
"c",
|
|
|
|
"n",
|
|
|
|
"s",
|
|
|
|
"o",
|
|
|
|
"S",
|
|
|
|
"u",
|
|
|
|
"D",
|
|
|
|
"C",
|
|
|
|
"b",
|
|
|
|
"P",
|
|
|
|
"p",
|
|
|
|
"K",
|
|
|
|
"B",
|
|
|
|
"R",
|
|
|
|
"O",
|
|
|
|
"a",
|
|
|
|
"w",
|
2021-11-23 23:13:40 +00:00
|
|
|
}
|
2021-07-10 11:06:10 +00:00
|
|
|
for _, value in pairs(keys) do
|
2021-08-11 23:52:22 +00:00
|
|
|
local cmd = "silent! unmap " .. value
|
2021-07-10 11:06:10 +00:00
|
|
|
vim.cmd(cmd)
|
|
|
|
end
|
|
|
|
|
2021-08-11 23:52:22 +00:00
|
|
|
vim.cmd([[silent! vunmap p]])
|
2021-11-29 20:19:45 +00:00
|
|
|
end
|
|
|
|
|
2022-06-30 05:34:48 +00:00
|
|
|
M.disconnect_dap = function()
|
2022-01-16 23:31:24 +00:00
|
|
|
local has_dap, dap = pcall(require, "dap")
|
|
|
|
if has_dap then
|
2022-05-29 13:07:39 +00:00
|
|
|
dap.disconnect()
|
|
|
|
dap.repl.close()
|
2022-06-16 01:38:37 +00:00
|
|
|
vim.cmd("sleep 100m") -- allow cleanup
|
|
|
|
else
|
|
|
|
vim.notify("dap not found")
|
2022-01-16 23:31:24 +00:00
|
|
|
end
|
2022-06-30 05:34:48 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
M.stop = function(unm)
|
|
|
|
if unm then
|
|
|
|
unmap()
|
|
|
|
end
|
|
|
|
M.disconnect_dap()
|
|
|
|
|
2021-11-29 20:19:45 +00:00
|
|
|
local has_dapui, dapui = pcall(require, "dapui")
|
|
|
|
if has_dapui then
|
2022-06-30 05:34:48 +00:00
|
|
|
if dapui_opened() then
|
2022-03-07 06:09:42 +00:00
|
|
|
dapui.close()
|
|
|
|
end
|
2021-11-29 20:19:45 +00:00
|
|
|
end
|
2022-04-20 02:00:49 +00:00
|
|
|
|
2022-06-30 05:34:48 +00:00
|
|
|
require("dap").repl.close()
|
2022-04-20 02:00:49 +00:00
|
|
|
if stdout then
|
|
|
|
stdout:close()
|
|
|
|
stdout = nil
|
|
|
|
end
|
|
|
|
if stderr then
|
|
|
|
stderr:close()
|
|
|
|
stderr = nil
|
|
|
|
end
|
|
|
|
if handle then
|
|
|
|
handle:close()
|
|
|
|
handle = nil
|
|
|
|
end
|
2021-07-10 11:06:10 +00:00
|
|
|
end
|
|
|
|
|
2021-07-10 13:53:33 +00:00
|
|
|
function M.ultest_post()
|
|
|
|
vim.g.ultest_use_pty = 1
|
|
|
|
local builders = {
|
|
|
|
["go#richgo"] = function(cmd)
|
|
|
|
local args = {}
|
|
|
|
for i = 3, #cmd, 1 do
|
|
|
|
local arg = cmd[i]
|
|
|
|
if vim.startswith(arg, "-") then
|
|
|
|
arg = "-test." .. string.sub(arg, 2)
|
|
|
|
end
|
|
|
|
args[#args + 1] = arg
|
|
|
|
end
|
2021-10-24 23:05:02 +00:00
|
|
|
|
2021-07-10 13:53:33 +00:00
|
|
|
return {
|
|
|
|
dap = {
|
|
|
|
type = "go",
|
|
|
|
request = "launch",
|
|
|
|
mode = "test",
|
2021-11-10 02:20:54 +00:00
|
|
|
program = sep .. "${relativeFileDirname}",
|
2021-07-10 13:53:33 +00:00
|
|
|
dlvToolPath = vim.fn.exepath("dlv"),
|
2021-10-24 23:05:02 +00:00
|
|
|
args = args,
|
2021-12-16 22:02:29 +00:00
|
|
|
buildFlags = get_build_flags(),
|
2021-07-10 13:53:33 +00:00
|
|
|
},
|
|
|
|
parse_result = function(lines)
|
|
|
|
return lines[#lines] == "FAIL" and 1 or 0
|
2021-12-16 22:02:29 +00:00
|
|
|
end,
|
2021-07-10 13:53:33 +00:00
|
|
|
}
|
2021-12-16 22:02:29 +00:00
|
|
|
end,
|
2021-07-10 13:53:33 +00:00
|
|
|
}
|
|
|
|
|
2022-05-29 13:07:39 +00:00
|
|
|
local ul = utils.load_plugin("vim-ultest", "ultest")
|
2021-12-16 22:59:47 +00:00
|
|
|
if ul then
|
|
|
|
ul.setup({ builders = builders })
|
|
|
|
end
|
2021-07-10 13:53:33 +00:00
|
|
|
end
|
|
|
|
|
2021-07-10 11:06:10 +00:00
|
|
|
return M
|