aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/lua/treesitter.c5
-rw-r--r--test/functional/lua/treesitter_spec.lua40
2 files changed, 43 insertions, 2 deletions
diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c
index 9e3bbb38fc..6176a1b7c3 100644
--- a/src/nvim/lua/treesitter.c
+++ b/src/nvim/lua/treesitter.c
@@ -447,8 +447,9 @@ static int parser_set_ranges(lua_State *L) {
}
// TODO: For sure that's wrong, try to find a way to get the byte offset directly
- uint32_t start_byte = ml_find_line_or_offset(buf, start_row, NULL, false) + start_col;
- uint32_t stop_byte = ml_find_line_or_offset(buf, stop_row, NULL, false) + stop_col;
+ // Lines are 0 based for consistency
+ uint32_t start_byte = ml_find_line_or_offset(buf, start_row + 1, NULL, false) + start_col;
+ uint32_t stop_byte = ml_find_line_or_offset(buf, stop_row + 1, NULL, false) + stop_col;
ranges[index] = (TSRange) {
.start_point = (TSPoint) {
diff --git a/test/functional/lua/treesitter_spec.lua b/test/functional/lua/treesitter_spec.lua
index ecee471386..1fd93d5f56 100644
--- a/test/functional/lua/treesitter_spec.lua
+++ b/test/functional/lua/treesitter_spec.lua
@@ -404,4 +404,44 @@ static int nlua_schedule(lua_State *const lstate)
end
eq({true,true}, {has_named,has_anonymous})
end)
+ it('allows to set ranges', function()
+ if not check_parser() then return end
+
+ insert(test_text)
+
+ local res = exec_lua([[
+ parser = vim.treesitter.get_parser(0, "c")
+ return { parser:parse():root():range() }
+ ]])
+
+ eq({0, 0, 19, 0}, res)
+
+ local res = exec_lua([[
+ parser:set_included_ranges({{0, 0, 1, 0}})
+ parser.valid = false
+ return { parser:parse():root():range() }
+ ]])
+
+ eq({0, 0, 1, 0}, res)
+
+ -- Pick random samples
+ local res = exec_lua([[
+ parser:set_included_ranges({{8, 0, 9, 0}, {12, 0, 13 ,0}})
+ local root = parser:parse():root()
+ return {{root:child(0):range()}, {root:child(1):range()}}
+ ]])
+
+ eq({{
+ 8,
+ 2,
+ 8,
+ 33
+ },
+ {
+ 12,
+ 4,
+ 12,
+ 37
+ }}, res)
+ end)
end)