Skip to content

Commit

Permalink
Merge pull request #22 from jinzhongjia/inlay_hint
Browse files Browse the repository at this point in the history
Inlay hint
  • Loading branch information
jinzhongjia authored Aug 27, 2023
2 parents 64a762b + d0fa420 commit e704047
Show file tree
Hide file tree
Showing 6 changed files with 173 additions and 39 deletions.
6 changes: 5 additions & 1 deletion lua/LspUI/_meta.lua
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
--- @field command_enable boolean? whether enable command for `hover`
--- @field key_binding { prev: string?, next: string?, quit: string? }? keybind for `hover`

--- @class LspUI_inlay_hint_config
--- @field enable boolean? whether enable `inlay_hint` module

-- this is just for some keybind like definition, type definition, declaration, reference, implementation
--- @alias LspUI_pos_keybind_config { secondary: { jump: string?, quit:string?, hide_main:string?, enter: string? }?, main: { back: string?, hide_secondary: string? }? }

Expand Down Expand Up @@ -53,7 +56,8 @@
--- @field lightbulb LspUI_lightbulb_config? `lightbulb` module
--- @field code_action LspUI_code_action_config? `code_action` module
--- @field diagnostic LspUI_diagnostic_config? `diagnostic` module
--- @field hover LspUI_hover_config? `hover` module
--- @field hover LspUI_hover_config? `hover` module
--- @field inlay_hint LspUI_inlay_hint_config? `inlay_hint` module
--- @field definition LspUI_definition_config? `definition` module
--- @field type_definition LspUI_type_definition_config? `type_definition` module
--- @field declaration LspUI_declaration_config? `declaration` module
Expand Down
49 changes: 38 additions & 11 deletions lua/LspUI/config.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
local global = require("LspUI.global")
local lib_notify = require("LspUI.lib.notify")

--- @type LspUI_rename_config
Expand Down Expand Up @@ -51,6 +50,11 @@ local default_hover_config = {
},
}

--- @type LspUI_inlay_hint_config
local default_inlay_hint_config = {
enable = true,
}

--- @type LspUI_definition_config
local default_definition_config = {
enable = true,
Expand Down Expand Up @@ -103,6 +107,7 @@ local default_config = {
code_action = default_code_action_config,
diagnostic = default_diagnostic_config,
hover = default_hover_config,
inlay_hint = default_inlay_hint_config,
definition = default_definition_config,
type_definition = default_type_definition_config,
declaration = default_declaration_config,
Expand Down Expand Up @@ -153,10 +158,14 @@ M.lightbulb_setup = function(lightbulb_config)
M.options.lightbulb or default_lightbulb_config,
lightbulb_config
)
vim.fn.sign_define(
global.lightbulb.sign_name,
{ text = M.options.lightbulb.icon }
)

local lightbulb = require("LspUI.lightbulb")

if M.options.lightbulb.enable then
lightbulb.init()
else
lightbulb.deinit()
end
end

-- separate function for `code_action` module
Expand Down Expand Up @@ -191,7 +200,7 @@ end

-- separate function for `definition` module
--- @param definition_config LspUI_definition_config
M.definition = function(definition_config)
M.definition_setup = function(definition_config)
M.options.definition = vim.tbl_deep_extend(
"force",
M.options.definition or default_definition_config,
Expand All @@ -201,7 +210,7 @@ end

-- separate function for `type_definition` module
--- @param type_definition_config LspUI_type_definition_config
M.type_definition = function(type_definition_config)
M.type_definition_setup = function(type_definition_config)
M.options.type_definition = vim.tbl_deep_extend(
"force",
M.options.type_definition or default_type_definition_config,
Expand All @@ -211,7 +220,7 @@ end

-- separate function for `declaration` module
--- @param declaration_config LspUI_declaration_config
M.declaration = function(declaration_config)
M.declaration_setup = function(declaration_config)
M.options.declaration = vim.tbl_deep_extend(
"force",
M.options.declaration or default_declaration_config,
Expand All @@ -221,7 +230,7 @@ end

-- separate function for `reference` module
--- @param reference_config LspUI_reference_config
M.reference = function(reference_config)
M.reference_setup = function(reference_config)
M.options.reference = vim.tbl_deep_extend(
"force",
M.options.reference or default_reference_config,
Expand All @@ -231,7 +240,7 @@ end

-- separate function for `implementation` module
--- @param implementation_config LspUI_implementation_config
M.implementation = function(implementation_config)
M.implementation_setup = function(implementation_config)
M.options.implementation = vim.tbl_deep_extend(
"force",
M.options.implementation or default_implementation_config,
Expand All @@ -241,12 +250,30 @@ end

-- separate function for `pos_keybind` module
--- @param pos_keybind_config LspUI_pos_keybind_config
M.pos_keybind = function(pos_keybind_config)
M.pos_keybind_setup = function(pos_keybind_config)
M.options.pos_keybind = vim.tbl_deep_extend(
"force",
M.options.pos_keybind or default_pos_keybind_config,
pos_keybind_config
)
end

-- separate function for `inlay_hint` module
--- @param inlay_hint_config LspUI_inlay_hint_config
M.inlay_hint_setup = function(inlay_hint_config)
M.options.inlay_hint = vim.tbl_deep_extend(
"force",
M.options.inlay_hint or default_inlay_hint_config,
inlay_hint_config
)

local inlay_hint = require("LspUI.inlay_hint")

if inlay_hint_config.enable then
inlay_hint.init()
else
inlay_hint.deinit()
end
end

return M
72 changes: 72 additions & 0 deletions lua/LspUI/inlay_hint/init.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
local api, lsp = vim.api, vim.lsp
local inlay_hint_feature = lsp.protocol.Methods.textDocument_inlayHint

local config = require("LspUI.config")
local lib_notify = require("LspUI.lib.notify")
local lib_util = require("LspUI.lib.util")

local M = {}

local buffer_list = {}
local autocmd_id = -1

-- whether this module has initialized
local is_initialized = false

-- init for inlay hint
M.init = function()
if not config.options.inlay_hint.enable then
return
end

if is_initialized then
return
end

is_initialized = true

local inlay_hint_group =
api.nvim_create_augroup("Lspui_inlay_hint", { clear = true })

autocmd_id = api.nvim_create_autocmd("LspAttach", {
group = inlay_hint_group,
callback = function(arg)
--- @type integer
local buffer_id = arg.buf

local clients = lsp.get_clients({
bufnr = buffer_id,
method = inlay_hint_feature,
})
if not vim.tbl_isempty(clients) then
lsp.inlay_hint(buffer_id, true)
table.insert(buffer_list, buffer_id)
end
end,
desc = lib_util.command_desc("inlay hint"),
})
end

-- run for inlay_hint
M.run = function()
lib_notify.Info("inlay hint has no run func")
end

-- deinit for inlay_hint
M.deinit = function()
if not is_initialized then
return
end

for _, buffer_id in pairs(buffer_list) do
if api.nvim_buf_is_valid(buffer_id) then
lsp.inlay_hint(buffer_id, false)
end
end

pcall(api.nvim_del_autocmd, autocmd_id)

is_initialized = false
end

return M
12 changes: 12 additions & 0 deletions lua/LspUI/lightbulb/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,16 @@ M.run = function()
lib_notify.Info("lightbulb has no run func")
end

-- deinit for lightbulb
M.deinit = function()
if not is_initialized then
return
end

util.unregister_sign()
util.un_autocmd()

is_initialized = false
end

return M
72 changes: 45 additions & 27 deletions lua/LspUI/lightbulb/util.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ local lib_util = require("LspUI.lib.util")

local M = {}

local lightbulb_group =
api.nvim_create_augroup("Lspui_lightBulb", { clear = true })
local attach_autocmd_id = -1
local autocmd_list = {}

-- get all valid clients for lightbulb
--- @param buffer_id integer
Expand Down Expand Up @@ -55,6 +55,11 @@ M.register_sign = function()
)
end

-- unregister the sign
M.unregister_sign = function()
fn.sign_undefine(global.lightbulb.sign_name)
end

-- this function will request all lsp clients
--- @param buffer_id integer buffer's id
--- @param callback function callback is a function, has a param boolean
Expand Down Expand Up @@ -154,8 +159,11 @@ end

-- auto command for lightbulb
M.autocmd = function()
local lightbulb_group =
api.nvim_create_augroup("Lspui_lightBulb", { clear = true })

-- here is just no cache option
api.nvim_create_autocmd("LspAttach", {
attach_autocmd_id = api.nvim_create_autocmd("LspAttach", {
group = lightbulb_group,
callback = function()
-- get current buffer
Expand All @@ -165,21 +173,11 @@ M.autocmd = function()
{ clear = true }
)

-- local debounce_func = lib_util.debounce(function()
-- M.request(current_buffer, function(result)
-- M.clear_render()
-- if result then
-- local line = fn.line(".")
-- if line == nil then
-- return
-- end
-- M.render(current_buffer, line)
-- end
-- end)
-- end, 250)
autocmd_list[current_buffer] = {}

local new_func = debounce_func(current_buffer)
api.nvim_create_autocmd({ "CursorHold" }, {

local hold_autocmd_id = api.nvim_create_autocmd({ "CursorHold" }, {
group = group_id,
buffer = current_buffer,
callback = vim.schedule_wrap(function()
Expand All @@ -190,28 +188,48 @@ M.autocmd = function()
),
})

api.nvim_create_autocmd({ "InsertEnter", "WinLeave" }, {
group = group_id,
buffer = current_buffer,
callback = function()
M.clear_render()
end,
desc = lib_util.command_desc(
"Lightbulb update when InsertEnter"
),
})
local move_autocmd_id = api.nvim_create_autocmd(
{ "InsertEnter", "WinLeave" },
{
group = group_id,
buffer = current_buffer,
callback = function()
M.clear_render()
end,
desc = lib_util.command_desc(
"Lightbulb update when InsertEnter"
),
}
)

api.nvim_create_autocmd({ "BufWipeout" }, {
local wipe_autocmd_id = api.nvim_create_autocmd({ "BufWipeout" }, {
group = group_id,
buffer = current_buffer,
callback = function()
api.nvim_del_augroup_by_id(group_id)
end,
desc = lib_util.command_desc("Exec clean cmd when QuitPre"),
})

for _, autocmd_id in pairs({
hold_autocmd_id,
move_autocmd_id,
wipe_autocmd_id,
}) do
table.insert(autocmd_list[current_buffer], autocmd_id)
end
end,
desc = lib_util.command_desc("Lsp attach lightbulb cmd"),
})
end

M.un_autocmd = function()
pcall(api.nvim_del_autocmd, attach_autocmd_id)
for _, autocmd_ids in pairs(autocmd_list) do
for _, autocmd_id in pairs(autocmd_ids) do
pcall(api.nvim_del_autocmd, autocmd_id)
end
end
end

return M
1 change: 1 addition & 0 deletions lua/LspUI/modules.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ return {
declaration = require("LspUI.declaration"),
implementation = require("LspUI.implementation"),
reference = require("LspUI.reference"),
inlay_hint = require("LspUI.inlay_hint"),
}

0 comments on commit e704047

Please sign in to comment.