Skip to content

Commit aad2c8e

Browse files
authored
feat: support quantified captures (#612)
This commit also removes all uses of `#make-range!` as it is no longer necessary.
1 parent a34d063 commit aad2c8e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1119
-2192
lines changed

lua/nvim-treesitter-textobjects/shared.lua

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
local ts = vim.treesitter
2+
local add_bytes = require("vim.treesitter._range").add_bytes
23

34
-- luacheck: push ignore 631
45
---@alias TSTextObjects.Metadata {range: {[1]: number, [2]: number, [3]: number, [4]: number, [5]: number, [6]: number, [7]: string}}
@@ -82,29 +83,19 @@ local get_query_matches = memoize(function(bufnr, query_group, root, root_lang)
8283
-- Extract capture names from each match
8384
for id, nodes in pairs(match) do
8485
local query_name = query.captures[id] -- name of the capture in the query
85-
if type(nodes) ~= "table" then
86-
nodes = { nodes }
87-
end
8886
if query_name ~= nil then
8987
local path = vim.split(query_name, "%.")
90-
for _, node in ipairs(nodes) do
91-
local range = { node:range(true) }
92-
---@cast range Range6
93-
94-
-- Range could be changed by directives
95-
local node_data = metadata[id]
96-
if node_data and node_data.range then
97-
range = {
98-
node_data.range[1],
99-
node_data.range[2],
100-
range[3],
101-
node_data.range[3],
102-
node_data.range[4],
103-
range[6],
104-
}
88+
if metadata[id] and metadata[id].range then
89+
insert_to_path(prepared_match, path, add_bytes(bufnr, metadata[id].range))
90+
else
91+
local srow, scol, sbyte, erow, ecol, ebyte = nodes[1]:range(true)
92+
if #nodes > 1 then
93+
local _, _, _, e_erow, e_ecol, e_ebyte = nodes[#nodes]:range(true)
94+
erow = e_erow
95+
ecol = e_ecol
96+
ebyte = e_ebyte
10597
end
106-
107-
insert_to_path(prepared_match, path, range)
98+
insert_to_path(prepared_match, path, { srow, scol, sbyte, erow, ecol, ebyte })
10899
end
109100
end
110101
end
@@ -436,16 +427,7 @@ M.available_textobjects = memoize(function(lang, query_group)
436427
return {}
437428
end
438429

439-
local found_textobjects = parsed_queries.captures or {}
440-
for _, pattern in pairs(parsed_queries.info.patterns) do
441-
for _, q in ipairs(pattern) do
442-
local query, arg1 = unpack(q) --[=[@as string, string[]]=]
443-
if query == "make-range!" and not vim.tbl_contains(found_textobjects, arg1) then
444-
table.insert(found_textobjects, arg1)
445-
end
446-
end
447-
end
448-
return found_textobjects
430+
return parsed_queries.captures or {}
449431
end, function(lang, query_group)
450432
return string.format("%s-%s", lang, query_group)
451433
end)

plugin/query_predicates.lua

Lines changed: 0 additions & 45 deletions
This file was deleted.

queries/apex/textobjects.scm

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,17 @@
77
body: (block
88
.
99
"{"
10-
.
11-
(_) @_start
12-
(_)? @_end
13-
.
14-
"}"
15-
(#make-range! "function.inner" @_start @_end)))
10+
_+ @function.inner
11+
"}"))
1612

1713
(constructor_declaration) @function.outer
1814

1915
(constructor_declaration
2016
body: (constructor_body
2117
.
2218
"{"
23-
.
24-
(_) @_start
25-
(_)? @_end
26-
.
27-
"}"
28-
(#make-range! "function.inner" @_start @_end)))
19+
_+ @function.inner
20+
"}"))
2921

3022
(for_statement
3123
body: (_)? @loop.inner) @loop.outer
@@ -59,39 +51,31 @@
5951
arguments: (argument_list
6052
.
6153
"("
62-
.
63-
(_) @_start
64-
(_)? @_end
65-
.
66-
")"
67-
(#make-range! "call.inner" @_start @_end)))
54+
_+ @call.inner
55+
")"))
6856

6957
; parameters
7058
(formal_parameters
71-
"," @_start
59+
"," @parameter.outer
7260
.
73-
(formal_parameter) @parameter.inner
74-
(#make-range! "parameter.outer" @_start @parameter.inner))
61+
(formal_parameter) @parameter.inner @parameter.outer)
7562

7663
(formal_parameters
7764
.
78-
(formal_parameter) @parameter.inner
65+
(formal_parameter) @parameter.inner @parameter.outer
7966
.
80-
","? @_end
81-
(#make-range! "parameter.outer" @parameter.inner @_end))
67+
","? @parameter.outer)
8268

8369
(argument_list
84-
"," @_start
70+
"," @parameter.outer
8571
.
86-
(_) @parameter.inner
87-
(#make-range! "parameter.outer" @_start @parameter.inner))
72+
(_) @parameter.inner @parameter.outer)
8873

8974
(argument_list
9075
.
91-
(_) @parameter.inner
76+
(_) @parameter.inner @parameter.outer
9277
.
93-
","? @_end
94-
(#make-range! "parameter.outer" @parameter.inner @_end))
78+
","? @parameter.outer)
9579

9680
[
9781
(line_comment)

queries/bash/textobjects.scm

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,8 @@
44
body: (compound_statement
55
.
66
"{"
7-
.
8-
(_) @_start
9-
(_)? @_end
10-
.
11-
"}"
12-
(#make-range! "function.inner" @_start @_end)))
7+
_+ @function.inner
8+
"}"))
139

1410
(case_statement) @conditional.outer
1511

queries/c/textobjects.scm

Lines changed: 26 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
; TODO: supported by official Tree-sitter if (_)* is more than one node
2-
; Neovim: will only match if (_) is exactly one node
3-
;(function_definition
4-
;body: (compound_statement
5-
;("{" (_)* @function.inner "}"))?) @function.outer
61
(declaration
72
declarator: (function_declarator)) @function.outer
83

@@ -13,12 +8,8 @@
138
body: (compound_statement
149
.
1510
"{"
16-
.
17-
(_) @_start
18-
(_)? @_end
19-
.
20-
"}"
21-
(#make-range! "function.inner" @_start @_end)))
11+
_+ @function.inner
12+
"}"))
2213

2314
(struct_specifier
2415
body: (_) @class.inner) @class.outer
@@ -31,24 +22,16 @@
3122
consequence: (compound_statement
3223
.
3324
"{"
34-
.
35-
(_) @_start
36-
(_)? @_end
37-
.
38-
"}"
39-
(#make-range! "conditional.inner" @_start @_end))) @conditional.outer
25+
_+ @conditional.inner
26+
"}")) @conditional.outer
4027

4128
(if_statement
4229
alternative: (else_clause
4330
(compound_statement
4431
.
4532
"{"
46-
.
47-
(_) @_start
48-
(_)? @_end
49-
.
50-
"}"
51-
(#make-range! "conditional.inner" @_start @_end)))) @conditional.outer
33+
_+ @conditional.inner
34+
"}"))) @conditional.outer
5235

5336
(if_statement) @conditional.outer
5437

@@ -74,38 +57,26 @@
7457
body: (compound_statement
7558
.
7659
"{"
77-
.
78-
(_) @_start
79-
(_)? @_end
80-
.
81-
"}"
82-
(#make-range! "loop.inner" @_start @_end))) @loop.outer
60+
_+ @loop.inner
61+
"}")) @loop.outer
8362

8463
(for_statement) @loop.outer
8564

8665
(for_statement
8766
body: (compound_statement
8867
.
8968
"{"
90-
.
91-
(_) @_start
92-
(_)? @_end
93-
.
94-
"}"
95-
(#make-range! "loop.inner" @_start @_end))) @loop.outer
69+
_+ @loop.inner
70+
"}")) @loop.outer
9671

9772
(do_statement) @loop.outer
9873

9974
(do_statement
10075
body: (compound_statement
10176
.
10277
"{"
103-
.
104-
(_) @_start
105-
(_)? @_end
106-
.
107-
"}"
108-
(#make-range! "loop.inner" @_start @_end))) @loop.outer
78+
_+ @loop.inner
79+
"}")) @loop.outer
10980

11081
(compound_statement) @block.outer
11182

@@ -117,12 +88,8 @@
11788
arguments: (argument_list
11889
.
11990
"("
120-
.
121-
(_) @_start
122-
(_)? @_end
123-
.
124-
")"
125-
(#make-range! "call.inner" @_start @_end)))
91+
_+ @call.inner
92+
")"))
12693

12794
(return_statement
12895
(_)? @return.inner) @return.outer
@@ -145,31 +112,27 @@
145112
(preproc_else
146113
(_) @statement.outer)
147114

148-
((parameter_list
149-
"," @_start
115+
(parameter_list
116+
"," @parameter.outer
150117
.
151-
(parameter_declaration) @parameter.inner)
152-
(#make-range! "parameter.outer" @_start @parameter.inner))
118+
(parameter_declaration) @parameter.inner @parameter.outer)
153119

154-
((parameter_list
120+
(parameter_list
155121
.
156-
(parameter_declaration) @parameter.inner
122+
(parameter_declaration) @parameter.inner @parameter.outer
157123
.
158-
","? @_end)
159-
(#make-range! "parameter.outer" @parameter.inner @_end))
124+
","? @parameter.outer)
160125

161-
((argument_list
162-
"," @_start
126+
(argument_list
127+
"," @parameter.outer
163128
.
164-
(_) @parameter.inner)
165-
(#make-range! "parameter.outer" @_start @parameter.inner))
129+
(_) @parameter.inner @parameter.outer)
166130

167-
((argument_list
131+
(argument_list
168132
.
169-
(_) @parameter.inner
133+
(_) @parameter.inner @parameter.outer
170134
.
171-
","? @_end)
172-
(#make-range! "parameter.outer" @parameter.inner @_end))
135+
","? @parameter.outer)
173136

174137
(number_literal) @number.inner
175138

0 commit comments

Comments
 (0)