diff options
| -rw-r--r-- | lua/nvim-treesitter/indent.lua | 18 | ||||
| -rw-r--r-- | queries/lua/indents.scm | 1 | ||||
| -rw-r--r-- | tests/indent/c_spec.lua | 2 | ||||
| -rw-r--r-- | tests/indent/cpp_spec.lua | 4 | ||||
| -rw-r--r-- | tests/indent/lua/comment.lua | 6 | ||||
| -rw-r--r-- | tests/indent/lua_spec.lua | 4 | ||||
| -rw-r--r-- | tests/indent/python_spec.lua | 5 |
7 files changed, 29 insertions, 11 deletions
diff --git a/lua/nvim-treesitter/indent.lua b/lua/nvim-treesitter/indent.lua index 4ec0a3e2..6230d11b 100644 --- a/lua/nvim-treesitter/indent.lua +++ b/lua/nvim-treesitter/indent.lua @@ -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 diff --git a/queries/lua/indents.scm b/queries/lua/indents.scm index 0eb0fc1b..64b6a33d 100644 --- a/queries/lua/indents.scm +++ b/queries/lua/indents.scm @@ -36,6 +36,7 @@ (else_statement) ] @branch +(comment) @auto (comment) @ignore (string) @auto diff --git a/tests/indent/c_spec.lua b/tests/indent/c_spec.lua index 40d393ca..2c19ba77 100644 --- a/tests/indent/c_spec.lua +++ b/tests/indent/c_spec.lua @@ -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) diff --git a/tests/indent/cpp_spec.lua b/tests/indent/cpp_spec.lua index b3f39437..7ac69e2a 100644 --- a/tests/indent/cpp_spec.lua +++ b/tests/indent/cpp_spec.lua @@ -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) diff --git a/tests/indent/lua/comment.lua b/tests/indent/lua/comment.lua index 9f3624e1..36ed0153 100644 --- a/tests/indent/lua/comment.lua +++ b/tests/indent/lua/comment.lua @@ -5,3 +5,9 @@ another comment --]] + + --[[ + another + comment + a bit more indented + --]] diff --git a/tests/indent/lua_spec.lua b/tests/indent/lua_spec.lua index 2577e483..17584a9e 100644 --- a/tests/indent/lua_spec.lua +++ b/tests/indent/lua_spec.lua @@ -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 }) diff --git a/tests/indent/python_spec.lua b/tests/indent/python_spec.lua index c9fcaf01..da8a97b6 100644 --- a/tests/indent/python_spec.lua +++ b/tests/indent/python_spec.lua @@ -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 }) |
