Files
gitlab.nvim/lua/gitlab/indicators/signs.lua
Harrison (Harry) Cramer c73d22996e Fix: Fixes Misspelling In Diagnostics Settings Check (#210)
This is a #PATCH fix release
2024-03-03 12:15:57 -05:00

97 lines
3.1 KiB
Lua

local u = require("gitlab.utils")
local state = require("gitlab.state")
local List = require("gitlab.utils.list")
local discussion_sign_name = require("gitlab.indicators.diagnostics").discussion_sign_name
local namespace = require("gitlab.indicators.diagnostics").diagnostics_namespace
local M = {}
M.clear_signs = function()
vim.fn.sign_unplace(discussion_sign_name)
end
local gitlab_comment = "GitlabComment"
local gitlab_range = "GitlabRange"
local severity_map = {
"Error",
"Warn",
"Info",
"Hint",
}
---Refresh the discussion signs for currently loaded file in reviewer For convinience we use same
---string for sign name and sign group ( currently there is only one sign needed)
---@param diagnostics Diagnostic[]
---@param bufnr number
M.set_signs = function(diagnostics, bufnr)
if not state.settings.discussion_signs.enabled then
return
end
-- Filter diagnostics from the 'gitlab' source and apply custom signs
for _, diagnostic in ipairs(diagnostics) do
---@type SignTable[]
local existing_signs =
vim.fn.sign_getplaced(vim.api.nvim_get_current_buf(), { group = "gitlab_discussion" })[1].signs
local sign_id = string.format("%s__%d", namespace, diagnostic.lnum)
if diagnostic.end_lnum then
local linenr = diagnostic.lnum + 1
while linenr <= diagnostic.end_lnum do
linenr = linenr + 1
local conflicting_comment_sign = List.new(existing_signs):find(function(sign)
return u.ends_with(sign.name, gitlab_comment) and sign.lnum == linenr
end)
if conflicting_comment_sign == nil then
vim.fn.sign_place(
sign_id,
discussion_sign_name,
"DiagnosticSign" .. M.severity .. gitlab_range,
bufnr,
{ lnum = linenr, priority = state.settings.discussion_signs.priority }
)
end
end
end
vim.fn.sign_place(
sign_id,
discussion_sign_name,
"DiagnosticSign" .. M.severity .. gitlab_comment,
bufnr,
{ lnum = diagnostic.lnum + 1, priority = state.settings.discussion_signs.priority }
)
-- TODO: Detect whether diagnostic is ranged and set helper signs
end
end
---Define signs for discussions
M.setup_signs = function()
local discussion_sign_settings = state.settings.discussion_signs
local comment_icon = discussion_sign_settings.icons.comment
local range_icon = discussion_sign_settings.icons.range
M.severity = severity_map[state.settings.discussion_signs.severity]
local signs = { "Error", "Warn", "Hint", "Info" }
for _, type in ipairs(signs) do
-- Define comment highlight group
local hl = "DiagnosticSign" .. type
local comment_hl = hl .. gitlab_comment
vim.fn.sign_define(comment_hl, {
text = comment_icon,
texthl = comment_hl,
})
vim.cmd(string.format("highlight link %s %s", comment_hl, hl))
-- Define range highlight group
local range_hl = hl .. gitlab_range
vim.fn.sign_define(range_hl, {
text = range_icon,
texthl = range_hl,
})
vim.cmd(string.format("highlight link %s %s", range_hl, hl))
end
end
return M