emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/treesit-fold 36768e42d9 116/417: Add basic c preprocessor


From: ELPA Syncer
Subject: [nongnu] elpa/treesit-fold 36768e42d9 116/417: Add basic c preprocessor
Date: Mon, 1 Jul 2024 10:02:17 -0400 (EDT)

branch: elpa/treesit-fold
commit 36768e42d9743dcd48ab65352bbee9305cf28966
Author: Jen-Chieh <jcs090218@gmail.com>
Commit: Jen-Chieh <jcs090218@gmail.com>

    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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]