aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/tshighlighter.lua
diff options
context:
space:
mode:
authorThomas Vigouroux <tomvig38@gmail.com>2020-07-06 22:11:30 +0200
committerThomas Vigouroux <tomvig38@gmail.com>2020-07-10 17:16:24 +0200
commit0f7eaa35551f979f4458e7a71fa14f9ef987807c (patch)
tree8cd0ac58c5cc9ea6237ea9dfe497a0fec33d4c19 /runtime/lua/vim/tshighlighter.lua
parentd19132ffd1df21cd4dbd608435530ee6044d1829 (diff)
downloadrneovim-0f7eaa35551f979f4458e7a71fa14f9ef987807c.tar.gz
rneovim-0f7eaa35551f979f4458e7a71fa14f9ef987807c.tar.bz2
rneovim-0f7eaa35551f979f4458e7a71fa14f9ef987807c.zip
treesitter: cache the capture hl relation
Diffstat (limited to 'runtime/lua/vim/tshighlighter.lua')
-rw-r--r--runtime/lua/vim/tshighlighter.lua40
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,