diff --git a/helix-core/src/indent.rs b/helix-core/src/indent.rs index 9526fc8ad..1c813c9ae 100644 --- a/helix-core/src/indent.rs +++ b/helix-core/src/indent.rs @@ -461,60 +461,58 @@ fn query_indents( /// so that the indent computation starts with the correct syntax node. fn extend_nodes<'a>( node: &mut Node<'a>, - deepest_preceding: Option>, + mut deepest_preceding: Node<'a>, extend_captures: &HashMap>, text: RopeSlice, line: usize, tab_width: usize, ) { - if let Some(mut deepest_preceding) = deepest_preceding { - let mut stop_extend = false; - while deepest_preceding != *node { - let mut extend_node = false; - // This will be set to true if this node is captured, regardless of whether - // it actually will be extended (e.g. because the cursor isn't indented - // more than the node). - let mut node_captured = false; - if let Some(captures) = extend_captures.get(&deepest_preceding.id()) { - for capture in captures { - match capture { - ExtendCapture::PreventOnce => { - stop_extend = true; - } - ExtendCapture::Extend => { - node_captured = true; - // We extend the node if - // - the cursor is on the same line as the end of the node OR - // - the line that the cursor is on is more indented than the - // first line of the node - if deepest_preceding.end_position().row == line { + let mut stop_extend = false; + + while deepest_preceding != *node { + let mut extend_node = false; + // This will be set to true if this node is captured, regardless of whether + // it actually will be extended (e.g. because the cursor isn't indented + // more than the node). + let mut node_captured = false; + if let Some(captures) = extend_captures.get(&deepest_preceding.id()) { + for capture in captures { + match capture { + ExtendCapture::PreventOnce => { + stop_extend = true; + } + ExtendCapture::Extend => { + node_captured = true; + // We extend the node if + // - the cursor is on the same line as the end of the node OR + // - the line that the cursor is on is more indented than the + // first line of the node + if deepest_preceding.end_position().row == line { + extend_node = true; + } else { + let cursor_indent = indent_level_for_line(text.line(line), tab_width); + let node_indent = indent_level_for_line( + text.line(deepest_preceding.start_position().row), + tab_width, + ); + if cursor_indent > node_indent { extend_node = true; - } else { - let cursor_indent = - indent_level_for_line(text.line(line), tab_width); - let node_indent = indent_level_for_line( - text.line(deepest_preceding.start_position().row), - tab_width, - ); - if cursor_indent > node_indent { - extend_node = true; - } } } } } } - // If we encountered some `StopExtend` capture before, we don't - // extend the node even if we otherwise would - if node_captured && stop_extend { - stop_extend = false; - } else if extend_node && !stop_extend { - *node = deepest_preceding; - break; - } - // This parent always exists since node is an ancestor of deepest_preceding - deepest_preceding = deepest_preceding.parent().unwrap(); } + // If we encountered some `StopExtend` capture before, we don't + // extend the node even if we otherwise would + if node_captured && stop_extend { + stop_extend = false; + } else if extend_node && !stop_extend { + *node = deepest_preceding; + break; + } + // This parent always exists since node is an ancestor of deepest_preceding + deepest_preceding = deepest_preceding.parent().unwrap(); } } @@ -612,14 +610,16 @@ pub fn treesitter_indent_for_pos( let extend_captures = query_result.extend_captures; // Check for extend captures, potentially changing the node that the indent calculation starts with - extend_nodes( - &mut node, - deepest_preceding, - &extend_captures, - text, - line, - tab_width, - ); + if let Some(deepest_preceding) = deepest_preceding { + extend_nodes( + &mut node, + deepest_preceding, + &extend_captures, + text, + line, + tab_width, + ); + } let mut first_in_line = get_first_in_line(node, new_line.then(|| byte_pos)); let mut result = Indentation::default();