@@ -7,6 +7,31 @@ local function get_lang(bufnr)
77 return lang
88end
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
2954
3055--- @param bufnr number
3156--- @param region LuaSnip.MatchRegion
32- --- @return LanguageTree , string
57+ --- @return vim.treesitter. LanguageTree, string
3358local function reparse_buffer_after_removing_match (bufnr , region )
3459 local lang = get_lang (bufnr )
3560
@@ -45,7 +70,7 @@ local function reparse_buffer_after_removing_match(bufnr, region)
4570
4671 local source = table.concat (lines , " \n " )
4772
48- --- @type LanguageTree
73+ --- @type vim.treesitter. LanguageTree
4974 local parser = vim .treesitter .get_string_parser (source , lang , nil )
5075 if parser then
5176 parser :parse ()
@@ -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
95119end
96120
97121function 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
122145end
123146
124147local function capture_to_node (capture )
@@ -260,12 +283,12 @@ local builtin_tsnode_selectors = {
260283}
261284
262285--- @class LuaSnip.extra.TSParser
263- --- @field parser LanguageTree
286+ --- @field parser vim.treesitter. LanguageTree
264287--- @field source string | number
265288local TSParser = {}
266289
267290--- @param bufnr number ?
268- --- @param parser LanguageTree
291+ --- @param parser vim.treesitter. LanguageTree
269292--- @param source string | number
270293--- @return LuaSnip.extra.TSParser ?
271294function TSParser .new (bufnr , parser , source )
439462
440463return {
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 ,
0 commit comments