Slightly change the behavior of the @stop-extend capture.

This improves the behavior in case of multiple nested extensions.
This commit is contained in:
Daniel Ebert 2022-09-17 15:03:39 +02:00 committed by Blaž Hrastnik
parent 2b02785f19
commit dc443487d4
2 changed files with 16 additions and 14 deletions

View file

@ -54,10 +54,11 @@ for languages like Python, where for the purpose of indentation some nodes
- `@stop-extend`: - `@stop-extend`:
Prevents the first extension of an ancestor of this node. For example, in Python Prevents the first extension of an ancestor of this node. For example, in Python
a return expression always ends the block that it is in. Note that this only prevents a return expression always ends the block that it is in. Note that this only stops the
the next extension of one ancestor: If multiple ancestors can be extended (for example extension of the next `@extend-indented` capture. If multiple ancestors are captured,
multiple nested conditional blocks in python), only the extension of the innermost only the extension of the innermost one is prevented. All other ancestors are unaffected
ancestor is prevented. (regardless of whether the innermost ancestor would actually have been extended).
## Predicates ## Predicates

View file

@ -471,6 +471,10 @@ fn extend_nodes<'a>(
let mut stop_extend = false; let mut stop_extend = false;
while deepest_preceding != *node { while deepest_preceding != *node {
let mut extend_node = false; 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()) { if let Some(captures) = extend_captures.get(&deepest_preceding.id()) {
for capture in captures { for capture in captures {
match capture { match capture {
@ -478,6 +482,7 @@ fn extend_nodes<'a>(
stop_extend = true; stop_extend = true;
} }
ExtendCapture::ExtendIndented => { ExtendCapture::ExtendIndented => {
node_captured = true;
// We extend the node if // We extend the node if
// - the cursor is on the same line as the end of the node OR // - 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 // - the line that the cursor is on is more indented than the
@ -501,16 +506,12 @@ fn extend_nodes<'a>(
} }
// If we encountered some `StopExtend` capture before, we don't // If we encountered some `StopExtend` capture before, we don't
// extend the node even if we otherwise would // extend the node even if we otherwise would
match (extend_node, stop_extend) { if node_captured && stop_extend {
(true, true) => { stop_extend = false;
stop_extend = false; } else if extend_node && !stop_extend {
} *node = deepest_preceding;
(true, false) => { break;
*node = deepest_preceding; }
break;
}
_ => {}
};
// This parent always exists since node is an ancestor of deepest_preceding // This parent always exists since node is an ancestor of deepest_preceding
deepest_preceding = deepest_preceding.parent().unwrap(); deepest_preceding = deepest_preceding.parent().unwrap();
} }