Skip to content

Commit 4d711e1

Browse files
authored
Merge branch 'master' into types-for-mark-pos
2 parents 6485dd5 + a62e108 commit 4d711e1

8 files changed

Lines changed: 76 additions & 63 deletions

File tree

doc/luasnip.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*luasnip.txt* For NeoVim 0.7-0.11 Last change: 2026 January 23
1+
*luasnip.txt* For NeoVim 0.7-0.11 Last change: 2026 April 05
22

33
==============================================================================
44
Table of Contents *luasnip-table-of-contents*

lua/luasnip/extras/_treesitter.lua

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,31 @@ local function get_lang(bufnr)
77
return lang
88
end
99

10+
---Returns the parser for a specific buffer and attaches it to the buffer
11+
---
12+
---If needed, this will create the parser.
13+
---
14+
---If no parser can be created, nil (and an error message) is returned.
15+
---
16+
---This is a wrapper around Neovim's `vim.treesitter.get_parser()`, to normalize
17+
---the behavior of the old and new versions. The old version threw errors, the
18+
---new version returns them as values. This wrapper normalizes both to the new
19+
---version.
20+
---@param bufnr integer|nil Buffer the parser should be tied to (default: current buffer)
21+
---@param lang string|nil Language of this parser (default: from buffer filetype)
22+
---@param opts table|nil Options to pass to the created language tree
23+
---@return vim.treesitter.LanguageTree? object to use for parsing
24+
---@return string? error message, if applicable
25+
local function get_parser(bufnr, lang, opts)
26+
local has_parser, parser_or_err, err =
27+
pcall(vim.treesitter.get_parser, bufnr, lang, opts)
28+
if not has_parser then
29+
return nil, tostring(parser_or_err)
30+
end
31+
32+
return parser_or_err, err
33+
end
34+
1035
-- Inspect node
1136
---@param node TSNode?
1237
---@return string
@@ -85,13 +110,12 @@ function FixBufferContext:enter()
85110
{ "" }
86111
)
87112

88-
local parser, source =
89-
vim.treesitter.get_parser(self.ori_bufnr), self.ori_bufnr
113+
local parser = get_parser(self.ori_bufnr)
90114
if parser then
91115
parser:parse()
92116
end
93117

94-
return parser, source
118+
return parser, self.ori_bufnr
95119
end
96120

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

116-
local parser, source =
117-
vim.treesitter.get_parser(self.ori_bufnr), self.ori_bufnr
140+
local parser = get_parser(self.ori_bufnr)
118141
if parser then
119142
parser:parse()
120143
end
121-
return parser, source
144+
return parser, self.ori_bufnr
122145
end
123146

124147
local function capture_to_node(capture)
@@ -439,6 +462,7 @@ end
439462

440463
return {
441464
get_lang = get_lang,
465+
get_parser = get_parser,
442466
reparse_buffer_after_removing_match = reparse_buffer_after_removing_match,
443467
TSParser = TSParser,
444468
FixBufferContext = FixBufferContext,

lua/luasnip/extras/filetype_functions.lua

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@ local function fts_from_ts_lang(lang)
1212
end
1313

1414
local function from_cursor_pos()
15-
-- get_parser errors if parser not present (no grammar for language).
16-
local has_parser, parser = pcall(vim.treesitter.get_parser)
15+
local parser = require("luasnip.extras._treesitter").get_parser()
1716

18-
if has_parser then
17+
if parser then
1918
local cursor = require("luasnip.util.util").get_cursor_0ind()
2019
-- assumption: languagetree uses 0-indexed byte-ranges.
2120
local lang = parser

lua/luasnip/extras/fmt.lua

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,9 @@
11
local text_node = require("luasnip.nodes.textNode").T
2-
local wrap_nodes = require("luasnip.util.util").wrap_nodes
2+
local util = require("luasnip.util.util")
33
local extend_decorator = require("luasnip.util.extend_decorator")
44
local Str = require("luasnip.util.str")
55
local rp = require("luasnip.extras").rep
66

7-
-- https://gist.github.com/tylerneylon/81333721109155b2d244
8-
local function copy3(obj, seen)
9-
-- Handle non-tables and previously-seen tables.
10-
if type(obj) ~= "table" then
11-
return obj
12-
end
13-
if seen and seen[obj] then
14-
return seen[obj]
15-
end
16-
17-
-- New table; mark it as seen an copy recursively.
18-
local s = seen or {}
19-
local res = {}
20-
s[obj] = res
21-
for k, v in next, obj do
22-
res[copy3(k, s)] = copy3(v, s)
23-
end
24-
return setmetatable(res, getmetatable(obj))
25-
end
26-
277
-- Interpolate elements from `args` into format string with placeholders.
288
--
299
-- The placeholder syntax for selecting from `args` is similar to fmtlib and
@@ -102,7 +82,7 @@ local function interpolate(fmt, args, opts)
10282
if used_keys[key] then
10383
local jump_index = args[key]:get_jump_index() -- For nodes that don't have a jump index, copy it instead
10484
if not opts.repeat_duplicates or jump_index == nil then
105-
table.insert(elements, copy3(args[key]))
85+
table.insert(elements, util.copy3(args[key]))
10686
else
10787
table.insert(elements, rp(jump_index))
10888
end
@@ -198,7 +178,7 @@ local function format_nodes(str, nodes, opts)
198178
opts = vim.tbl_extend("force", defaults, opts or {})
199179

200180
-- allow to pass a single node
201-
nodes = wrap_nodes(nodes)
181+
nodes = util.wrap_nodes(nodes)
202182

203183
-- optimization: avoid splitting multiple times
204184
local lines = nil

lua/luasnip/extras/snip_location.lua

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ local M = {}
1212
-- return: 4-tuple, {start_line, start_col, end_line, end_col}, range of
1313
-- function-call.
1414
local function lua_find_function_call_node_at(bufnr, line)
15-
local has_parser, parser = pcall(vim.treesitter.get_parser, bufnr, "lua")
16-
if not has_parser then
17-
error("Error while getting parser: " .. parser)
15+
local parser, err =
16+
require("luasnip.extras._treesitter").get_parser(bufnr, "lua")
17+
if not parser then
18+
error("Error while getting parser: " .. err)
1819
end
1920

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

5859
local function json_find_snippet_definition(bufnr, filetype, snippet_name)
59-
local parser_ok, parser = pcall(vim.treesitter.get_parser, bufnr, filetype)
60-
if not parser_ok then
61-
error("Error while getting parser: " .. parser)
60+
local parser, err =
61+
require("luasnip.extras._treesitter").get_parser(bufnr, filetype)
62+
if not parser then
63+
error("Error while getting parser: " .. err)
6264
end
6365

6466
local root = parser:parse()[1]:root()

lua/luasnip/extras/treesitter_postfix.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ local function make_reparse_enter_and_leave_func(
7777
end
7878
else
7979
return function()
80-
local parser = vim.treesitter.get_parser(bufnr)
80+
local parser =
81+
require("luasnip.extras._treesitter").get_parser(bufnr)
8182
if parser then
8283
parser:parse()
8384
end

lua/luasnip/nodes/snippet.lua

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -859,28 +859,8 @@ function Snippet:matches(line_to_cursor, opts)
859859
return expand_params
860860
end
861861

862-
-- https://gist.github.com/tylerneylon/81333721109155b2d244
863-
local function copy3(obj, seen)
864-
-- Handle non-tables and previously-seen tables.
865-
if type(obj) ~= "table" then
866-
return obj
867-
end
868-
if seen and seen[obj] then
869-
return seen[obj]
870-
end
871-
872-
-- New table; mark it as seen an copy recursively.
873-
local s = seen or {}
874-
local res = {}
875-
s[obj] = res
876-
for k, v in next, obj do
877-
res[copy3(k, s)] = copy3(v, s)
878-
end
879-
return setmetatable(res, getmetatable(obj))
880-
end
881-
882862
function Snippet:copy()
883-
return copy3(self)
863+
return util.copy3(self)
884864
end
885865

886866
function Snippet:del_marks()

lua/luasnip/util/util.lua

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ end
7070
--- by.
7171
---@param parent_indent_displaycolumns number, displaycolumn this text is
7272
--- already at.
73-
---@return string[], `text` (only for simple nesting).
73+
---@return string[] _ `text` (only for simple nesting).
7474
local function expand_tabs(text, tabwidth, parent_indent_displaycolumns)
7575
for i, line in ipairs(text) do
7676
local new_line = ""
@@ -258,7 +258,7 @@ local function to_line_table(table_or_string)
258258
-- split entries at \n.
259259
local line_table = {}
260260
for _, str in ipairs(tbl) do
261-
local split = vim.split(str, "\n", true)
261+
local split = vim.split(str, "\n", { plain = true })
262262
for i = 1, #split do
263263
line_table[#line_table + 1] = split[i]
264264
end
@@ -472,6 +472,32 @@ local function shallow_copy(t)
472472
return t
473473
end
474474

475+
--- Deepcopy given table, with support for recursive tables & metatable.
476+
--- Taken from: https://gist.github.com/tylerneylon/81333721109155b2d244
477+
---
478+
---@generic T: table
479+
---@param obj T
480+
---@param seen? table
481+
---@return T
482+
local function copy3(obj, seen)
483+
-- Handle non-tables and previously-seen tables.
484+
if type(obj) ~= "table" then
485+
return obj
486+
end
487+
if seen and seen[obj] then
488+
return seen[obj]
489+
end
490+
491+
-- New table; mark it as seen an copy recursively.
492+
local s = seen or {}
493+
local res = {}
494+
s[obj] = res
495+
for k, v in next, obj do
496+
res[copy3(k, s)] = copy3(v, s)
497+
end
498+
return setmetatable(res, getmetatable(obj))
499+
end
500+
475501
return {
476502
get_cursor_0ind = get_cursor_0ind,
477503
set_cursor_0ind = set_cursor_0ind,
@@ -515,4 +541,5 @@ return {
515541
pos_offset = pos_offset,
516542
pos_from_offset = pos_from_offset,
517543
shallow_copy = shallow_copy,
544+
copy3 = copy3,
518545
}

0 commit comments

Comments
 (0)