fix(dap.hover): more cleanup
This commit is contained in:
+18
-23
@@ -10,18 +10,11 @@ local log = require("ow.log")
|
|||||||
---@param line_nr integer
|
---@param line_nr integer
|
||||||
---@param col_nr integer
|
---@param col_nr integer
|
||||||
---@param current_file string
|
---@param current_file string
|
||||||
local function hover_eval(
|
local function eval(expr, session, frame_id, line_nr, col_nr, current_file)
|
||||||
expr,
|
|
||||||
session,
|
|
||||||
frame_id,
|
|
||||||
line_nr,
|
|
||||||
col_nr,
|
|
||||||
current_file
|
|
||||||
)
|
|
||||||
local win = Window.get_instance()
|
local win = Window.get_instance()
|
||||||
win:close()
|
win:close()
|
||||||
|
|
||||||
local eval_request = {
|
local request = {
|
||||||
expression = expr,
|
expression = expr,
|
||||||
frameId = frame_id,
|
frameId = frame_id,
|
||||||
context = "hover",
|
context = "hover",
|
||||||
@@ -32,23 +25,21 @@ local function hover_eval(
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
local err, resp = session:request("evaluate", eval_request)
|
local err, resp = session:request("evaluate", request)
|
||||||
if err or not resp then
|
if err then
|
||||||
log.warning("Failed to evaluate '%s': %s", expr, err)
|
log.warning("Failed to evaluate '%s': %s", expr, err)
|
||||||
|
end
|
||||||
|
if err or not resp then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local item =
|
local item = Item.new(expr, resp.type, resp.result, resp.variablesReference)
|
||||||
Item.new(expr, resp.type, resp.result, resp.variablesReference, 0)
|
win.tree = Tree.new(session)
|
||||||
local tree = Tree.new(session)
|
|
||||||
|
|
||||||
tree:build(item)
|
win.tree:build(item)
|
||||||
local content = tree:render()
|
local content = win.tree:render()
|
||||||
local lines = content:get_lines()
|
|
||||||
|
|
||||||
win.tree = tree
|
win:show(content)
|
||||||
|
|
||||||
win:show(lines, content)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---@async
|
---@async
|
||||||
@@ -119,8 +110,10 @@ local function hover_async()
|
|||||||
local thread_id
|
local thread_id
|
||||||
do
|
do
|
||||||
local err, resp = session:request("threads", nil)
|
local err, resp = session:request("threads", nil)
|
||||||
if err or not resp or #resp.threads == 0 then
|
if err then
|
||||||
log.warning("Failed to get threads: %s", err)
|
log.warning("Failed to get threads: %s", err)
|
||||||
|
end
|
||||||
|
if err or not resp or #resp.threads == 0 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
thread_id = resp.threads[1].id
|
thread_id = resp.threads[1].id
|
||||||
@@ -130,14 +123,16 @@ local function hover_async()
|
|||||||
do
|
do
|
||||||
local err, resp =
|
local err, resp =
|
||||||
session:request("stackTrace", { threadId = thread_id })
|
session:request("stackTrace", { threadId = thread_id })
|
||||||
if err or not resp or #resp.stackFrames == 0 then
|
if err then
|
||||||
log.warning("Failed to get stack trace: %s", err)
|
log.warning("Failed to get stack trace: %s", err)
|
||||||
|
end
|
||||||
|
if err or not resp or #resp.stackFrames == 0 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
frame_id = resp.stackFrames[1].id
|
frame_id = resp.stackFrames[1].id
|
||||||
end
|
end
|
||||||
|
|
||||||
hover_eval(expr, session, frame_id, line_nr, col_nr, current_file)
|
eval(expr, session, frame_id, line_nr, col_nr, current_file)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function hover()
|
local function hover()
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ end
|
|||||||
|
|
||||||
---@return string[]
|
---@return string[]
|
||||||
function Content:get_lines()
|
function Content:get_lines()
|
||||||
return vim.split(self.text, "\n", { trimempty = true })
|
return vim.split(vim.trim(self.text), "\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param ns_id integer
|
---@param ns_id integer
|
||||||
|
|||||||
+10
-15
@@ -1,5 +1,7 @@
|
|||||||
local Content = require("ow.dap.hover.content")
|
local Content = require("ow.dap.hover.content")
|
||||||
|
local Item = require("ow.dap.item")
|
||||||
local Node = require("ow.dap.hover.node")
|
local Node = require("ow.dap.hover.node")
|
||||||
|
local log = require("ow.log")
|
||||||
|
|
||||||
---@class ow.dap.hover.Tree
|
---@class ow.dap.hover.Tree
|
||||||
---@field session dap.Session
|
---@field session dap.Session
|
||||||
@@ -12,9 +14,7 @@ Tree.__index = Tree
|
|||||||
function Tree.new(session)
|
function Tree.new(session)
|
||||||
return setmetatable({
|
return setmetatable({
|
||||||
session = session,
|
session = session,
|
||||||
root_node = nil,
|
root = nil,
|
||||||
line_to_node = {},
|
|
||||||
extmark_to_node = {},
|
|
||||||
}, Tree)
|
}, Tree)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -40,25 +40,20 @@ function Tree:load_children(node)
|
|||||||
local err, resp = self.session:request("variables", {
|
local err, resp = self.session:request("variables", {
|
||||||
variablesReference = node.item.variablesReference,
|
variablesReference = node.item.variablesReference,
|
||||||
})
|
})
|
||||||
|
if err then
|
||||||
|
log.warning("Failed to get variables for %s: %s", node.item.name, err)
|
||||||
|
end
|
||||||
if err or not resp or #resp.variables == 0 then
|
if err or not resp or #resp.variables == 0 then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
for i, var in ipairs(resp.variables) do
|
for i, var in ipairs(resp.variables) do
|
||||||
local child_item = {
|
local item = Item.from_var(var)
|
||||||
name = var.name,
|
local child = Node.new(item, node)
|
||||||
type = var.type,
|
|
||||||
value = var.value,
|
|
||||||
variablesReference = var.variablesReference,
|
|
||||||
depth = node.item.depth + 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
local child = Node.new(child_item, node)
|
|
||||||
child.is_last_child = (i == #resp.variables)
|
child.is_last_child = (i == #resp.variables)
|
||||||
|
|
||||||
if child_item.name:match("^%d+$") then
|
if item.name:match("^%d+$") then
|
||||||
child_item.name = "[" .. child_item.name .. "]"
|
item.name = "[" .. item.name .. "]"
|
||||||
end
|
end
|
||||||
|
|
||||||
table.insert(node.children, child)
|
table.insert(node.children, child)
|
||||||
|
|||||||
@@ -42,9 +42,11 @@ function Window:close()
|
|||||||
vim.api.nvim_del_augroup_by_id(self.augroup)
|
vim.api.nvim_del_augroup_by_id(self.augroup)
|
||||||
end
|
end
|
||||||
|
|
||||||
self.augroup = nil
|
self.max_width = nil
|
||||||
|
self.max_height = nil
|
||||||
self.winid = nil
|
self.winid = nil
|
||||||
self.bufnr = nil
|
self.bufnr = nil
|
||||||
|
self.augroup = nil
|
||||||
self.tree = nil
|
self.tree = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -69,12 +71,12 @@ function Window:compute_height()
|
|||||||
return math.min(self.max_height or text_height, text_height)
|
return math.min(self.max_height or text_height, text_height)
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param lines string[]
|
|
||||||
---@param content ow.dap.hover.Content
|
---@param content ow.dap.hover.Content
|
||||||
function Window:show(lines, content)
|
function Window:show(content)
|
||||||
local prev_buf = vim.api.nvim_get_current_buf()
|
local prev_buf = vim.api.nvim_get_current_buf()
|
||||||
self.bufnr = vim.api.nvim_create_buf(false, true)
|
self.bufnr = vim.api.nvim_create_buf(false, true)
|
||||||
|
|
||||||
|
local lines = content:get_lines()
|
||||||
vim.api.nvim_buf_set_lines(self.bufnr, 0, -1, false, lines)
|
vim.api.nvim_buf_set_lines(self.bufnr, 0, -1, false, lines)
|
||||||
vim.bo[self.bufnr].modifiable = false
|
vim.bo[self.bufnr].modifiable = false
|
||||||
|
|
||||||
|
|||||||
+3
-8
@@ -3,7 +3,6 @@
|
|||||||
---@field type string
|
---@field type string
|
||||||
---@field value string
|
---@field value string
|
||||||
---@field variablesReference? number
|
---@field variablesReference? number
|
||||||
---@field depth integer
|
|
||||||
local Item = {}
|
local Item = {}
|
||||||
Item.__index = Item
|
Item.__index = Item
|
||||||
|
|
||||||
@@ -11,28 +10,24 @@ Item.__index = Item
|
|||||||
---@param type string
|
---@param type string
|
||||||
---@param value string
|
---@param value string
|
||||||
---@param variablesReference? number
|
---@param variablesReference? number
|
||||||
---@param depth integer
|
|
||||||
---@return ow.dap.Item
|
---@return ow.dap.Item
|
||||||
function Item.new(name, type, value, variablesReference, depth)
|
function Item.new(name, type, value, variablesReference)
|
||||||
return setmetatable({
|
return setmetatable({
|
||||||
name = name,
|
name = name,
|
||||||
type = type,
|
type = type,
|
||||||
value = value,
|
value = value,
|
||||||
variablesReference = variablesReference,
|
variablesReference = variablesReference,
|
||||||
depth = depth,
|
|
||||||
}, Item)
|
}, Item)
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param var dap.Variable
|
---@param var dap.Variable
|
||||||
---@param depth integer
|
|
||||||
---@return ow.dap.Item
|
---@return ow.dap.Item
|
||||||
function Item.from_var(var, depth)
|
function Item.from_var(var)
|
||||||
return Item.new(
|
return Item.new(
|
||||||
var.name,
|
var.name,
|
||||||
var.type,
|
var.type,
|
||||||
var.value,
|
var.value,
|
||||||
var.variablesReference,
|
var.variablesReference
|
||||||
depth
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user