mirror of
https://github.com/nvim-treesitter/nvim-treesitter.git
synced 2026-07-04 04:20:09 -04:00
fix(indents): re-parse before each indent
This commit is contained in:
parent
fd5a551d7c
commit
b06961a519
7 changed files with 29 additions and 11 deletions
|
|
@ -1,7 +1,6 @@
|
|||
local parsers = require "nvim-treesitter.parsers"
|
||||
local queries = require "nvim-treesitter.query"
|
||||
local tsutils = require "nvim-treesitter.ts_utils"
|
||||
local highlighter = require "vim.treesitter.highlighter"
|
||||
|
||||
local function get_first_node_at_line(root, lnum)
|
||||
local col = vim.fn.indent(lnum)
|
||||
|
|
@ -18,7 +17,7 @@ local function find_delimiter(bufnr, node, delimiter)
|
|||
if child:type() == delimiter then
|
||||
local linenr = child:start()
|
||||
local line = vim.api.nvim_buf_get_lines(bufnr, linenr, linenr + 1, false)[1]
|
||||
local end_char = {child:end_()}
|
||||
local end_char = { child:end_() }
|
||||
return child, #line == end_char[2]
|
||||
end
|
||||
end
|
||||
|
|
@ -56,6 +55,10 @@ function M.get_indent(lnum)
|
|||
if not parser or not lnum then
|
||||
return -1
|
||||
end
|
||||
|
||||
-- Reparse in case we got triggered by ":h indentkeys"
|
||||
parser:parse()
|
||||
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
|
||||
-- get_root_for_position is 0-based.
|
||||
|
|
@ -81,7 +84,8 @@ function M.get_indent(lnum)
|
|||
|
||||
local indent_size = vim.fn.shiftwidth()
|
||||
local indent = 0
|
||||
if root:start() ~= 0 then
|
||||
local _, _, root_start = root:start()
|
||||
if root_start ~= 0 then
|
||||
-- injected tree
|
||||
indent = vim.fn.indent(root:start() + 1)
|
||||
end
|
||||
|
|
@ -119,7 +123,13 @@ function M.get_indent(lnum)
|
|||
end
|
||||
|
||||
-- do not indent for nodes that starts-and-ends on same line and starts on target line (lnum)
|
||||
if not is_processed_by_row[srow] and (q.indent[node:id()] and srow ~= erow and ((srow ~= lnum - 1) or q.indent[node:id()].start_at_same_line)) then
|
||||
if
|
||||
not is_processed_by_row[srow]
|
||||
-- Dear stylua, please don't change the semantics of this statement!
|
||||
-- stylua: ignore start
|
||||
and (q.indent[node:id()] and srow ~= erow and ((srow ~= lnum - 1) or q.indent[node:id()].start_at_same_line))
|
||||
-- stylua: ignore end
|
||||
then
|
||||
indent = indent + indent_size
|
||||
is_processed = true
|
||||
end
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
(else_statement)
|
||||
] @branch
|
||||
|
||||
(comment) @auto
|
||||
(comment) @ignore
|
||||
|
||||
(string) @auto
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ describe("indent C:", function()
|
|||
runner:new_line("cond.c", { on_line = 9, text = "x++;", indent = 4 })
|
||||
runner:new_line("expr.c", { on_line = 10, text = "2 *", indent = 8 })
|
||||
runner:new_line("func.c", { on_line = 17, text = "int z,", indent = 4 })
|
||||
runner:new_line("label.c", { on_line = 3, text = "normal:", indent = 0 }, "expected failure", XFAIL)
|
||||
runner:new_line("label.c", { on_line = 3, text = "normal:", indent = 0 })
|
||||
runner:new_line("loop.c", { on_line = 3, text = "x++;", indent = 8 })
|
||||
runner:new_line("preproc_cond.c", { on_line = 5, text = "x++;", indent = 4 })
|
||||
runner:new_line("preproc_func.c", { on_line = 3, text = "x++; \\", indent = 8 }, "expected failure", XFAIL)
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ describe("indent C++:", function()
|
|||
end)
|
||||
|
||||
describe("new line:", function()
|
||||
run:new_line("cpp/access.cpp", { on_line = 3, text = "protected:", indent = 0 }, "expected failure", XFAIL)
|
||||
run:new_line("cpp/access.cpp", { on_line = 3, text = "protected:", indent = 0 })
|
||||
run:new_line("cpp/class.cpp", { on_line = 2, text = "using T = int;", indent = 4 })
|
||||
run:new_line("cpp/stream.cpp", { on_line = 5, text = "<< x + 3", indent = 8 })
|
||||
|
||||
|
|
@ -34,7 +34,7 @@ describe("indent C++:", function()
|
|||
run:new_line("c/cond.c", { on_line = 9, text = "x++;", indent = 4 })
|
||||
run:new_line("c/expr.c", { on_line = 10, text = "2 *", indent = 8 })
|
||||
run:new_line("c/func.c", { on_line = 17, text = "int z,", indent = 4 })
|
||||
run:new_line("c/label.c", { on_line = 3, text = "normal:", indent = 0 }, "expected failure", XFAIL)
|
||||
run:new_line("c/label.c", { on_line = 3, text = "normal:", indent = 0 })
|
||||
run:new_line("c/loop.c", { on_line = 3, text = "x++;", indent = 8 })
|
||||
run:new_line("c/preproc_cond.c", { on_line = 5, text = "x++;", indent = 4 })
|
||||
run:new_line("c/preproc_func.c", { on_line = 3, text = "x++; \\", indent = 8 }, "expected failure", XFAIL)
|
||||
|
|
|
|||
|
|
@ -5,3 +5,9 @@
|
|||
another
|
||||
comment
|
||||
--]]
|
||||
|
||||
--[[
|
||||
another
|
||||
comment
|
||||
a bit more indented
|
||||
--]]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
local Runner = require("tests.indent.common").Runner
|
||||
local XFAIL = require("tests.indent.common").XFAIL
|
||||
--local XFAIL = require("tests.indent.common").XFAIL
|
||||
|
||||
local run = Runner:new(it, "tests/indent/lua", {
|
||||
tabstop = 2,
|
||||
|
|
@ -19,7 +19,7 @@ describe("indent Lua:", function()
|
|||
|
||||
describe("new line:", function()
|
||||
run:new_line("comment.lua", { on_line = 1, text = "line", indent = "-- " })
|
||||
run:new_line("comment.lua", { on_line = 5, text = "multiline", indent = " " }, "expected failure", XFAIL)
|
||||
run:new_line("comment.lua", { on_line = 5, text = "multiline", indent = " " })
|
||||
run:new_line("func.lua", { on_line = 1, text = "x = x + 1", indent = 2 })
|
||||
run:new_line("func.lua", { on_line = 2, text = "y = y + 1", indent = 4 })
|
||||
run:new_line("func.lua", { on_line = 4, text = "y = y + 1", indent = 2 })
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
local Runner = require("tests.indent.common").Runner
|
||||
local XFAIL = require("tests.indent.common").XFAIL
|
||||
|
||||
local run = Runner:new(it, "tests/indent/python", {
|
||||
tabstop = 4,
|
||||
|
|
@ -28,8 +29,8 @@ describe("indent Python:", function()
|
|||
run:new_line("control_flow.py", { on_line = 22, text = "x = 4", indent = 4 })
|
||||
run:new_line("hanging_indent.py", { on_line = 1, text = "arg0,", indent = 8 })
|
||||
run:new_line("hanging_indent.py", { on_line = 5, text = "0,", indent = 4 })
|
||||
run:new_line("join_lines.py", { on_line = 1, text = "+ 1 \\", indent = 4 })
|
||||
run:new_line("join_lines.py", { on_line = 4, text = "+ 1 \\", indent = 4 })
|
||||
run:new_line("join_lines.py", { on_line = 1, text = "+ 1 \\", indent = 4 }, "expected failure", XFAIL)
|
||||
run:new_line("join_lines.py", { on_line = 4, text = "+ 1 \\", indent = 4 }, "expected failure", XFAIL)
|
||||
run:new_line("join_lines.py", { on_line = 7, text = "+ 1 \\", indent = 4 })
|
||||
run:new_line("nested_collections.py", { on_line = 5, text = "0,", indent = 12 })
|
||||
run:new_line("nested_collections.py", { on_line = 6, text = ",0", indent = 12 })
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue