fix(treesitter): check if queries for indent/fold exists before enabling it. Fixes #6474

This commit is contained in:
Folke Lemaitre 2025-09-19 19:58:28 +02:00
parent 55e762a888
commit 5ce7cd650a
No known key found for this signature in database
GPG key ID: 9B52594D560070AB
2 changed files with 27 additions and 9 deletions

View file

@ -94,12 +94,12 @@ return {
end end
-- indents -- indents
if vim.tbl_get(opts, "indent", "enable") ~= false then if vim.tbl_get(opts, "indent", "enable") ~= false and LazyVim.treesitter.have(ev.match, "indents") then
LazyVim.set_default("indentexpr", "v:lua.LazyVim.treesitter.indentexpr()") LazyVim.set_default("indentexpr", "v:lua.LazyVim.treesitter.indentexpr()")
end end
-- folds -- folds
if vim.tbl_get(opts, "folds", "enable") ~= false then if vim.tbl_get(opts, "folds", "enable") ~= false and LazyVim.treesitter.have(ev.match, "folds") then
if LazyVim.set_default("foldmethod", "expr") then if LazyVim.set_default("foldmethod", "expr") then
LazyVim.set_default("foldexpr", "v:lua.LazyVim.treesitter.foldexpr()") LazyVim.set_default("foldexpr", "v:lua.LazyVim.treesitter.foldexpr()")
end end

View file

@ -1,36 +1,54 @@
---@class lazyvim.util.treesitter ---@class lazyvim.util.treesitter
local M = {} local M = {}
M._installed = nil ---@type table<string,string>? M._installed = nil ---@type table<string,boolean>?
M._queries = {} ---@type table<string,boolean>
---@param update boolean? ---@param update boolean?
function M.get_installed(update) function M.get_installed(update)
if update then if update then
M._installed = {} M._installed, M._queries = {}, {}
for _, lang in ipairs(require("nvim-treesitter").get_installed("parsers")) do for _, lang in ipairs(require("nvim-treesitter").get_installed("parsers")) do
M._installed[lang] = lang M._installed[lang] = true
end end
end end
return M._installed or {} return M._installed or {}
end end
---@param lang string
---@param query string
function M.have_query(lang, query)
local key = lang .. ":" .. query
if M._queries[key] == nil then
M._queries[key] = vim.treesitter.query.get(lang, query) ~= nil
end
return M._queries[key]
end
---@param what string|number|nil ---@param what string|number|nil
---@param query? string
---@overload fun(buf?:number):boolean ---@overload fun(buf?:number):boolean
---@overload fun(ft:string):boolean ---@overload fun(ft:string):boolean
---@return boolean ---@return boolean
function M.have(what) function M.have(what, query)
what = what or vim.api.nvim_get_current_buf() what = what or vim.api.nvim_get_current_buf()
what = type(what) == "number" and vim.bo[what].filetype or what --[[@as string]] what = type(what) == "number" and vim.bo[what].filetype or what --[[@as string]]
local lang = vim.treesitter.language.get_lang(what) local lang = vim.treesitter.language.get_lang(what)
return lang ~= nil and M.get_installed()[lang] ~= nil if lang == nil or M.get_installed()[lang] == nil then
return false
end
if query and not M.have_query(lang, query) then
return false
end
return true
end end
function M.foldexpr() function M.foldexpr()
return M.have() and vim.treesitter.foldexpr() or "0" return M.have(nil, "folds") and vim.treesitter.foldexpr() or "0"
end end
function M.indentexpr() function M.indentexpr()
return M.have() and require("nvim-treesitter").indentexpr() or -1 return M.have(nil, "indents") and require("nvim-treesitter").indentexpr() or -1
end end
---@param cb fun() ---@param cb fun()