diff options
Diffstat (limited to 'runtime/lua/vim/tshighlighter.lua')
-rw-r--r-- | runtime/lua/vim/tshighlighter.lua | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/runtime/lua/vim/tshighlighter.lua b/runtime/lua/vim/tshighlighter.lua index c1e77ea792..a0ff53cc00 100644 --- a/runtime/lua/vim/tshighlighter.lua +++ b/runtime/lua/vim/tshighlighter.lua @@ -46,16 +46,42 @@ function TSHighlighter.new(query, bufnr, ft) if vim.g.syntax_on ~= 1 then vim.api.nvim_command("runtime! syntax/synload.vim") end - return self end +local function is_highlight_name(capture_name) + local firstc = string.sub(capture_name, 1, 1) + return firstc ~= string.lower(firstc) +end + +function TSHighlighter:get_hl_from_capture(capture) + + local name = self.query.captures[capture] + + if is_highlight_name(name) then + -- From "Normal.left" only keep "Normal" + return vim.split(name, '.', true)[1] + else + -- Default to false to avoid recomputing + return TSHighlighter.hl_map[name] + end +end + function TSHighlighter:set_query(query) if type(query) == "string" then query = vim.treesitter.parse_query(self.parser.lang, query) end self.query = query + self.hl_cache = setmetatable({}, { + __index = function(table, capture) + local hl = self:get_hl_from_capture(capture) + rawset(table, capture, hl) + + return hl + end + }) + self:on_change({{self.root:range()}}) end @@ -71,17 +97,7 @@ function TSHighlighter:on_change(changes) for capture, node in self.query:iter_captures(changed_node, self.buf, ch[1], ch[3] + 1) do local start_row, start_col, end_row, end_col = node:range() - local capture_name = self.query.captures[capture] - - local firstc = string.sub(capture_name, 1, 1) - local hl - -- TODO(vigoux): maybe we want to cache the capture -> highlight relation - if firstc ~= string.lower(firstc) then - hl = vim.split(capture_name, '.', true)[1] - else - hl = TSHighlighter.hl_map[capture_name] - end - + local hl = self.hl_cache[capture] if hl then a.nvim__buf_add_decoration(self.buf, ts_hs_ns, hl, start_row, start_col, |