Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion doc/luasnip.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
*luasnip.txt* For NeoVim 0.7-0.11 Last change: 2026 January 19
*luasnip.txt* For NeoVim 0.7-0.11 Last change: 2026 March 19

==============================================================================
Table of Contents *luasnip-table-of-contents*
Expand Down
36 changes: 30 additions & 6 deletions lua/luasnip/extras/_treesitter.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,31 @@ local function get_lang(bufnr)
return lang
end

---Returns the parser for a specific buffer and attaches it to the buffer
---
---If needed, this will create the parser.
---
---If no parser can be created, nil (and an error message) is returned.
---
---This is a wrapper around Neovim's `vim.treesitter.get_parser()`, to normalize
---the behavior of the old and new versions. The old version threw errors, the
---new version returns them as values. This wrapper normalizes both to the new
---version.
---@param bufnr integer|nil Buffer the parser should be tied to (default: current buffer)
---@param lang string|nil Language of this parser (default: from buffer filetype)
---@param opts table|nil Options to pass to the created language tree
---@return vim.treesitter.LanguageTree? object to use for parsing
---@return string? error message, if applicable
local function get_parser(bufnr, lang, opts)
local has_parser, parser_or_err, err =
pcall(vim.treesitter.get_parser, bufnr, lang, opts)
if not has_parser then
return nil, tostring(parser_or_err)
end

return parser_or_err, err
end

-- Inspect node
---@param node TSNode?
---@return string
Expand Down Expand Up @@ -85,13 +110,12 @@ function FixBufferContext:enter()
{ "" }
)

local parser, source =
vim.treesitter.get_parser(self.ori_bufnr), self.ori_bufnr
local parser = get_parser(self.ori_bufnr)
if parser then
parser:parse()
end

return parser, source
return parser, self.ori_bufnr
end

function FixBufferContext:leave()
Expand All @@ -113,12 +137,11 @@ function FixBufferContext:leave()
{ self.region.row + 1, self.region.col_range[2] }
)

local parser, source =
vim.treesitter.get_parser(self.ori_bufnr), self.ori_bufnr
local parser = get_parser(self.ori_bufnr)
if parser then
parser:parse()
end
return parser, source
return parser, self.ori_bufnr
end

local function capture_to_node(capture)
Expand Down Expand Up @@ -439,6 +462,7 @@ end

return {
get_lang = get_lang,
get_parser = get_parser,
reparse_buffer_after_removing_match = reparse_buffer_after_removing_match,
TSParser = TSParser,
FixBufferContext = FixBufferContext,
Expand Down
5 changes: 2 additions & 3 deletions lua/luasnip/extras/filetype_functions.lua
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ local function fts_from_ts_lang(lang)
end

local function from_cursor_pos()
-- get_parser errors if parser not present (no grammar for language).
local has_parser, parser = pcall(vim.treesitter.get_parser)
local parser = require("luasnip.extras._treesitter").get_parser()
Comment thread
L3MON4D3 marked this conversation as resolved.

if has_parser then
if parser then
local cursor = require("luasnip.util.util").get_cursor_0ind()
-- assumption: languagetree uses 0-indexed byte-ranges.
local lang = parser
Expand Down
14 changes: 8 additions & 6 deletions lua/luasnip/extras/snip_location.lua
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ local M = {}
-- return: 4-tuple, {start_line, start_col, end_line, end_col}, range of
-- function-call.
local function lua_find_function_call_node_at(bufnr, line)
local has_parser, parser = pcall(vim.treesitter.get_parser, bufnr, "lua")
if not has_parser then
error("Error while getting parser: " .. parser)
local parser, err =
require("luasnip.extras._treesitter").get_parser(bufnr, "lua")
if not parser then
error("Error while getting parser: " .. err)
end

local root = parser:parse()[1]:root()
Expand Down Expand Up @@ -56,9 +57,10 @@ local function range_highlight(line_start, line_end, hl_duration_ms)
end

local function json_find_snippet_definition(bufnr, filetype, snippet_name)
local parser_ok, parser = pcall(vim.treesitter.get_parser, bufnr, filetype)
if not parser_ok then
error("Error while getting parser: " .. parser)
local parser, err =
require("luasnip.extras._treesitter").get_parser(bufnr, filetype)
if not parser then
error("Error while getting parser: " .. err)
end

local root = parser:parse()[1]:root()
Expand Down
3 changes: 2 additions & 1 deletion lua/luasnip/extras/treesitter_postfix.lua
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ local function make_reparse_enter_and_leave_func(
end
else
return function()
local parser = vim.treesitter.get_parser(bufnr)
local parser =
Comment thread
L3MON4D3 marked this conversation as resolved.
require("luasnip.extras._treesitter").get_parser(bufnr)
if parser then
parser:parse()
end
Expand Down