branch: elpa/treesit-fold
commit 36768e42d9743dcd48ab65352bbee9305cf28966
Author: Jen-Chieh <[email protected]>
Commit: Jen-Chieh <[email protected]>
Add basic c preprocessor
---
tree-sitter-fold-parsers.el | 1 +
tree-sitter-fold.el | 39 +++++++++++++++++++++++++++++++--------
2 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/tree-sitter-fold-parsers.el b/tree-sitter-fold-parsers.el
index bcb4b33acf..4de487fdf4 100644
--- a/tree-sitter-fold-parsers.el
+++ b/tree-sitter-fold-parsers.el
@@ -62,6 +62,7 @@
(declaration_list . tree-sitter-fold-range-seq)
(enumerator_list . tree-sitter-fold-range-seq)
(field_declaration_list . tree-sitter-fold-range-seq)
+ (preproc_def . tree-sitter-fold-range-c-preproc)
(comment . (tree-sitter-fold-range-seq 1 -1))))
(defun tree-sitter-fold-parsers-c++ ()
diff --git a/tree-sitter-fold.el b/tree-sitter-fold.el
index 0854903706..7cced425fc 100644
--- a/tree-sitter-fold.el
+++ b/tree-sitter-fold.el
@@ -331,9 +331,20 @@ If the current syntax node is not foldable, do nothing."
(advice-add command :after #'tree-sitter-fold--after-command)))
;;
-;; (@* "Languages" )
+;; (@* "Rule Helpers" )
;;
+(defun tree-sitter-fold--get-node-by-text (node text)
+ "Return node with matching TEXT.
+Argument NODE is the starting node."
+ (let ((current (tsc-get-next-sibling node)) result)
+ (while current
+ (if (string= text (string-trim (tsc-node-text current)))
+ (setq result current
+ current nil)
+ (setq current (tsc-get-next-sibling current))))
+ result))
+
(defun tree-sitter-fold--multi-line (node)
"Return t, if content NODE is single line."
(string-match-p "\n" (tsc-node-text node)))
@@ -395,18 +406,30 @@ more information."
(tree-sitter-fold-range-block-comment node offset)
(tree-sitter-fold-range-line-comment node offset "///")))
+;;
+;; (@* "Languages" )
+;;
+
+(defun tree-sitter-fold-range-c-preproc (node offset)
+ ""
+ (when-let* ((named-node (tsc-get-child-by-field node :name))
+ (beg (tsc-node-end-position named-node))
+ (end-node (tree-sitter-fold--get-node-by-text node "#endif"))
+ (end (1- (tsc-node-start-position end-node))))
+ (tree-sitter-fold-util--cons-add (cons beg end) offset)))
+
(defun tree-sitter-fold-range-python (node offset)
"Return the fold range for `function_definition' and `class_definition'.
For arguments NODE and OFFSET, see function `tree-sitter-fold-range-seq' for
more information."
- (let* ((named-node (or (tsc-get-child-by-field node :superclasses)
- (tsc-get-child-by-field node :return_type)
- (tsc-get-child-by-field node :parameters)
- (tsc-get-child-by-field node :name)))
- ;; the colon is an anonymous node after return_type or parameters node
- (beg (tsc-node-end-position (tsc-get-next-sibling named-node)))
- (end (tsc-node-end-position node)))
+ (when-let* ((named-node (or (tsc-get-child-by-field node :superclasses)
+ (tsc-get-child-by-field node :return_type)
+ (tsc-get-child-by-field node :parameters)
+ (tsc-get-child-by-field node :name)))
+ ;; the colon is an anonymous node after return_type or
parameters node
+ (beg (tsc-node-end-position (tsc-get-next-sibling named-node)))
+ (end (tsc-node-end-position node)))
(tree-sitter-fold-util--cons-add (cons beg end) offset)))
(defun tree-sitter-fold-range-ruby (_node _offset)