diff options
author | Luuk van Baal <luukvbaal@gmail.com> | 2024-11-24 14:46:20 +0100 |
---|---|---|
committer | luukvbaal <luukvbaal@gmail.com> | 2025-02-25 13:09:01 +0100 |
commit | 8ba047e33fe3a10765c593c810d54b5e3bb906e9 (patch) | |
tree | a31efbda695dcae1e1d31c738b72fec5669bf32f /runtime/lua/vim/treesitter/query.lua | |
parent | f58e7d5fac1c4f63f0ba3e59134591239182910e (diff) | |
download | rneovim-8ba047e33fe3a10765c593c810d54b5e3bb906e9.tar.gz rneovim-8ba047e33fe3a10765c593c810d54b5e3bb906e9.tar.bz2 rneovim-8ba047e33fe3a10765c593c810d54b5e3bb906e9.zip |
feat(treesitter): vertical conceal support for highlighter
TSHighlighter now places marks for conceal_lines metadata. A new
internal decor provider callback _on_conceal_line was added that
instructs the highlighter to place conceal_lines marks whenever the
editor needs to know whether a line is concealed. The bundled markdown
queries use conceal_lines metadata to conceal code block fence lines.
Diffstat (limited to 'runtime/lua/vim/treesitter/query.lua')
-rw-r--r-- | runtime/lua/vim/treesitter/query.lua | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua index d26aa8e604..f43c087457 100644 --- a/runtime/lua/vim/treesitter/query.lua +++ b/runtime/lua/vim/treesitter/query.lua @@ -10,6 +10,20 @@ local EXTENDS_FORMAT = '^;+%s*extends%s*$' local M = {} +---@nodoc +---Parsed query, see |vim.treesitter.query.parse()| +--- +---@class vim.treesitter.Query +---@field lang string parser language name +---@field captures string[] list of (unique) capture names defined in query +---@field info vim.treesitter.QueryInfo query context (e.g. captures, predicates, directives) +---@field has_conceal_line boolean whether the query sets conceal_lines metadata +---@field has_combined_injections boolean whether the query contains combined injections +---@field query TSQuery userdata query object +---@field private _processed_patterns table<integer, vim.treesitter.query.ProcessedPattern> +local Query = {} +Query.__index = Query + local function is_directive(name) return string.sub(name, -1) == '!' end @@ -28,15 +42,10 @@ end ---@field directives vim.treesitter.query.ProcessedDirective[] --- Splits the query patterns into predicates and directives. ----@param patterns table<integer, (integer|string)[][]> ----@return table<integer, vim.treesitter.query.ProcessedPattern> ----@return boolean -local function process_patterns(patterns) - ---@type table<integer, vim.treesitter.query.ProcessedPattern> - local processed_patterns = {} - local has_combined = false - - for k, pattern_list in pairs(patterns) do +function Query:_process_patterns() + self._processed_patterns = {} + + for k, pattern_list in pairs(self.info.patterns) do ---@type vim.treesitter.query.ProcessedPredicate[] local predicates = {} ---@type vim.treesitter.query.ProcessedDirective[] @@ -50,7 +59,10 @@ local function process_patterns(patterns) if is_directive(pred_name) then table.insert(directives, pattern) if vim.deep_equal(pattern, { 'set!', 'injection.combined' }) then - has_combined = true + self._has_combined_injections = true + end + if vim.deep_equal(pattern, { 'set!', 'conceal_lines', '' }) then + self.has_conceal_line = true end else local should_match = true @@ -62,25 +74,10 @@ local function process_patterns(patterns) end end - processed_patterns[k] = { predicates = predicates, directives = directives } + self._processed_patterns[k] = { predicates = predicates, directives = directives } end - - return processed_patterns, has_combined end ----@nodoc ----Parsed query, see |vim.treesitter.query.parse()| ---- ----@class vim.treesitter.Query ----@field lang string parser language name ----@field captures string[] list of (unique) capture names defined in query ----@field info vim.treesitter.QueryInfo query context (e.g. captures, predicates, directives) ----@field query TSQuery userdata query object ----@field has_combined_injections boolean whether the query contains combined injections ----@field private _processed_patterns table<integer, vim.treesitter.query.ProcessedPattern> -local Query = {} -Query.__index = Query - ---@package ---@see vim.treesitter.query.parse ---@param lang string @@ -96,7 +93,7 @@ function Query.new(lang, ts_query) patterns = query_info.patterns, } self.captures = self.info.captures - self._processed_patterns, self.has_combined_injections = process_patterns(self.info.patterns) + self:_process_patterns() return self end |