diff options
author | Lewis Russell <lewis6991@gmail.com> | 2024-11-08 11:46:53 +0000 |
---|---|---|
committer | Lewis Russell <me@lewisr.dev> | 2024-11-08 14:01:35 +0000 |
commit | 7342e6b00d5e9f67fd5ad4d3fadaf7e501598486 (patch) | |
tree | 6d75adb6e4a1250882f0eeaa6ef7f9554b4e18ba /runtime/lua/vim/lsp/semantic_tokens.lua | |
parent | 475f9f64ef6eb41643a74d71ae01f9f65057109e (diff) | |
download | rneovim-7342e6b00d5e9f67fd5ad4d3fadaf7e501598486.tar.gz rneovim-7342e6b00d5e9f67fd5ad4d3fadaf7e501598486.tar.bz2 rneovim-7342e6b00d5e9f67fd5ad4d3fadaf7e501598486.zip |
perf(lsp): do not apply semantic tokens to folded lines
Fixes #31106
Diffstat (limited to 'runtime/lua/vim/lsp/semantic_tokens.lua')
-rw-r--r-- | runtime/lua/vim/lsp/semantic_tokens.lua | 63 |
1 files changed, 42 insertions, 21 deletions
diff --git a/runtime/lua/vim/lsp/semantic_tokens.lua b/runtime/lua/vim/lsp/semantic_tokens.lua index d680522592..839ec8bea3 100644 --- a/runtime/lua/vim/lsp/semantic_tokens.lua +++ b/runtime/lua/vim/lsp/semantic_tokens.lua @@ -380,6 +380,20 @@ function STHighlighter:process_response(response, client, version) api.nvim__redraw({ buf = self.bufnr, valid = true }) end +--- @param bufnr integer +--- @param ns integer +--- @param token STTokenRange +--- @param hl_group string +--- @param priority integer +local function set_mark(bufnr, ns, token, hl_group, priority) + vim.api.nvim_buf_set_extmark(bufnr, ns, token.line, token.start_col, { + hl_group = hl_group, + end_col = token.end_col, + priority = priority, + strict = false, + }) +end + --- on_win handler for the decoration provider (see |nvim_set_decoration_provider|) --- --- If there is a current result for the buffer and the version matches the @@ -433,13 +447,14 @@ function STHighlighter:on_win(topline, botline) -- finishes, clangd sends a refresh request which lets the client -- re-synchronize the tokens. - local set_mark = function(token, hl_group, delta) - vim.api.nvim_buf_set_extmark(self.bufnr, state.namespace, token.line, token.start_col, { - hl_group = hl_group, - end_col = token.end_col, - priority = vim.hl.priorities.semantic_tokens + delta, - strict = false, - }) + local function set_mark0(token, hl_group, delta) + set_mark( + self.bufnr, + state.namespace, + token, + hl_group, + vim.hl.priorities.semantic_tokens + delta + ) end local ft = vim.bo[self.bufnr].filetype @@ -447,13 +462,19 @@ function STHighlighter:on_win(topline, botline) local first = lower_bound(highlights, topline, 1, #highlights + 1) local last = upper_bound(highlights, botline, first, #highlights + 1) - 1 - for i = first, last do + local i = first + while i <= last do local token = highlights[i] - if not token.marked then - set_mark(token, string.format('@lsp.type.%s.%s', token.type, ft), 0) - for modifier, _ in pairs(token.modifiers) do - set_mark(token, string.format('@lsp.mod.%s.%s', modifier, ft), 1) - set_mark(token, string.format('@lsp.typemod.%s.%s.%s', token.type, modifier, ft), 2) + local folded = vim.fn.foldclosed(token.line + 1) + + -- Do not highlight folded lines + local can_mark = folded == -1 or folded == token.line + 1 + + if can_mark and not token.marked then + set_mark0(token, string.format('@lsp.type.%s.%s', token.type, ft), 0) + for modifier in pairs(token.modifiers) do + set_mark0(token, string.format('@lsp.mod.%s.%s', modifier, ft), 1) + set_mark0(token, string.format('@lsp.typemod.%s.%s.%s', token.type, modifier, ft), 2) end token.marked = true @@ -466,6 +487,12 @@ function STHighlighter:on_win(topline, botline) }, }) end + + if folded ~= -1 then + i = math.min(last, vim.fn.foldclosedend(token.line + 1) - 1) + else + i = i + 1 + end end end end @@ -745,15 +772,9 @@ function M.highlight_token(token, bufnr, client_id, hl_group, opts) return end - opts = opts or {} - local priority = opts.priority or vim.hl.priorities.semantic_tokens + 3 + local priority = opts and opts.priority or vim.hl.priorities.semantic_tokens + 3 - vim.api.nvim_buf_set_extmark(bufnr, state.namespace, token.line, token.start_col, { - hl_group = hl_group, - end_col = token.end_col, - priority = priority, - strict = false, - }) + set_mark(bufnr, state.namespace, token, hl_group, priority) end --- |lsp-handler| for the method `workspace/semanticTokens/refresh` |