From e273de5490c6a8fbce053ab2a53d6cbf7faf6a17 Mon Sep 17 00:00:00 2001 From: Ben Kunkle Date: Tue, 25 Mar 2025 09:58:41 -0500 Subject: [PATCH] python: Fix incorrect indenting of `except`, `finally`, `else`, and `elif` control flow (#27428) Closes #10832 Note: This PR only fixes the issue where when entering one of `except`, `finally`, `else`, and `elif` after another block like so: ```python try: for i in range(n): pass except:| ``` The `except` would be indented resulting in the following: ```python try: for i in range(n): pass except:| ``` This PR does not fix a separate issue in which the indentation is not corrected from the second example to the first, i.e. if example 2 is typed verbatim in Zed it will not auto-indent to look like example 1. Handling of this case would likely require specific logic to handle, or changes to the tree-sitter grammar for Python, as the current grammar results in ERROR nodes that obscure the natural structure (cannot tie the `except` to the `try`) Release Notes: - Fixed an issue where `except`, `finally`, `else`, and `elif` control flow keywords in Python would be incorrectly indented when entered at the correct level of indentation. --- crates/languages/src/python/indents.scm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/crates/languages/src/python/indents.scm b/crates/languages/src/python/indents.scm index 112b414aa4..134b648cb6 100644 --- a/crates/languages/src/python/indents.scm +++ b/crates/languages/src/python/indents.scm @@ -1,3 +1,18 @@ (_ "[" "]" @end) @indent (_ "{" "}" @end) @indent (_ "(" ")" @end) @indent + +(try_statement + body: (_) @start + [(except_clause) (finally_clause)] @end + ) @indent + +(if_statement + consequence: (_) @start + alternative: (_) @end + ) @indent + +(_ + alternative: (elif_clause) @start + alternative: (_) @end + ) @indent