aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorMunif Tanjim <hello@muniftanjim.dev>2022-01-17 04:44:01 +0600
committerChristian Clason <christian.clason@uni-due.de>2022-01-21 10:51:51 +0100
commitbaf94219aae2ec2893c197f17e2eb36789b6a1d7 (patch)
treeb8ac5b17935a5b9f1bd8538ddd8b97a606e69892 /lua
parentUpdate README (diff)
downloadnvim-treesitter-baf94219aae2ec2893c197f17e2eb36789b6a1d7.tar
nvim-treesitter-baf94219aae2ec2893c197f17e2eb36789b6a1d7.tar.gz
nvim-treesitter-baf94219aae2ec2893c197f17e2eb36789b6a1d7.tar.bz2
nvim-treesitter-baf94219aae2ec2893c197f17e2eb36789b6a1d7.tar.lz
nvim-treesitter-baf94219aae2ec2893c197f17e2eb36789b6a1d7.tar.xz
nvim-treesitter-baf94219aae2ec2893c197f17e2eb36789b6a1d7.tar.zst
nvim-treesitter-baf94219aae2ec2893c197f17e2eb36789b6a1d7.zip
feat: improve indent module
get_node_at_line should return appropriate child if available
Diffstat (limited to 'lua')
-rw-r--r--lua/nvim-treesitter/indent.lua28
1 files changed, 26 insertions, 2 deletions
diff --git a/lua/nvim-treesitter/indent.lua b/lua/nvim-treesitter/indent.lua
index ebf7695de..b585f5862 100644
--- a/lua/nvim-treesitter/indent.lua
+++ b/lua/nvim-treesitter/indent.lua
@@ -4,11 +4,35 @@ local tsutils = require "nvim-treesitter.ts_utils"
local M = {}
+---@param lnum number (0-indexed)
+local function get_last_node_at_line(root, lnum)
+ local node
+ for i = 0, root:child_count() - 1 do
+ local child = root:child(i)
+ local child_srow = child:start()
+ if child_srow > lnum then
+ break
+ end
+ if child_srow == lnum then
+ node = child
+ end
+ end
+ return node
+end
+
-- TODO(kiyan): move this in tsutils and document it
+---@param lnum number (0-indexed)
local function get_node_at_line(root, lnum)
for node in root:iter_children() do
- local srow, _, erow = node:range()
+ local srow, scol, erow = node:range()
if srow == lnum then
+ if node:child_count() > 0 then
+ local child = get_last_node_at_line(node, srow)
+ if child and child:named() and ({ child:start() })[2] == scol then
+ -- last child node is named and start at the same col as parent
+ return child
+ end
+ end
return node
end
@@ -89,7 +113,7 @@ function M.get_indent(lnum)
-- if the previous node is being constructed (like function() `o` in lua), or line is inside the node
-- we indent one more from the start of node, else we indent default
-- NOTE: this doesn't work for python which behave strangely
- if prev_node:has_error() or lnum <= end_row then
+ if prev_node:has_error() or lnum - 1 < end_row then
return vim.fn.indent(row + 1) + indent_size
end
return vim.fn.indent(row + 1)