Skip to content

Commit c866b8e

Browse files
feat(parsers): Improve folding of block nodes in python (#32)
* feat(parsers): Improve folding of block nodes in python Add a new method treesit-fold-range-python-block in treesit-fold-parsers-python to fold below code blocks in python-ts-mode. - while_statement - for_statement - if_statement - elif_clause - else_clause - match_statement - case_clause - try_statement - except_clause - with_statement Fixes #31 * style: clean up * docs: changelog --------- Co-authored-by: JenChieh <jcs090218@gmail.com>
1 parent 6628b7c commit c866b8e

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
88
## 0.3.0 (Unreleased)
99
> Released N/A
1010
11-
* N/A
11+
* feat(parsers): Improve folding of block nodes in python (#32)
1212

1313
## 0.2.0
1414
> Released Feb 12, 2025

treesit-fold-parsers.el

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
(declare-function treesit-fold-range-cmake-body "treesit-fold.el")
9191
(declare-function treesit-fold-range-editorconfig-section "treesit-fold.el")
9292
(declare-function treesit-fold-range-pascal-comment "treesit-fold.el")
93+
(declare-function treesit-fold-range-python-block "treesit-fold.el")
9394
(declare-function treesit-fold-range-python-def "treesit-fold.el")
9495
(declare-function treesit-fold-range-python-expression-statement "treesit-fold.el")
9596
(declare-function treesit-fold-range-rst-body "treesit-fold.el")
@@ -587,6 +588,16 @@
587588
(future_import_statement . treesit-fold-range-seq)
588589
(function_definition . treesit-fold-range-python-def)
589590
(class_definition . treesit-fold-range-python-def)
591+
(while_statement . treesit-fold-range-python-block)
592+
(for_statement . treesit-fold-range-python-block)
593+
(if_statement . treesit-fold-range-python-block)
594+
(elif_clause . treesit-fold-range-python-block)
595+
(else_clause . treesit-fold-range-python-block)
596+
(match_statement . treesit-fold-range-python-block)
597+
(case_clause . treesit-fold-range-python-block)
598+
(try_statement . treesit-fold-range-python-block)
599+
(except_clause . treesit-fold-range-python-block)
600+
(with_statement . treesit-fold-range-python-block)
590601
(list . treesit-fold-range-seq)
591602
(dictionary . treesit-fold-range-seq)
592603
(parenthesized_expression . treesit-fold-range-seq)

treesit-fold.el

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,34 @@ more information."
13991399
(t
14001400
(treesit-fold-range-c-like-comment node offset)))))
14011401

1402+
(defun treesit-fold-range-python-block (node offset)
1403+
"Define fold range for `if_statement' and other blocks.
1404+
1405+
For arguments NODE and OFFSET, see function `treesit-fold-range-seq' for
1406+
more information."
1407+
(when-let* ((colon-node (car (treesit-fold-find-children node ":")))
1408+
(beg (treesit-node-start colon-node)))
1409+
(let ((current-node (treesit-node-next-sibling colon-node))
1410+
(last-body-node)
1411+
(end))
1412+
;; Iterate through siblings until we hit an elif or else clause
1413+
(while (and current-node
1414+
(not (member (treesit-node-type current-node)
1415+
'("elif_clause" "else_clause" "except_clause"))))
1416+
1417+
;; Only consider non-comment nodes as body nodes
1418+
(unless (string-match-p "comment" (treesit-node-type current-node))
1419+
(setq last-body-node current-node))
1420+
(setq current-node (treesit-node-next-sibling current-node)))
1421+
1422+
;; Set end position based on the last body node or fallback to node end
1423+
(setq end (if last-body-node
1424+
(treesit-node-end last-body-node)
1425+
(treesit-node-end node)))
1426+
1427+
;; Return the range and offset to fold
1428+
(treesit-fold--cons-add (cons (+ beg 1) end) offset))))
1429+
14021430
(defun treesit-fold-range-python-def (node offset)
14031431
"Define fold range for `function_definition' and `class_definition'.
14041432

0 commit comments

Comments
 (0)