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

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

[nongnu] elpa/treesit-fold a39f3bbe48 117/417: WIP for C preprocessor


From: ELPA Syncer
Subject: [nongnu] elpa/treesit-fold a39f3bbe48 117/417: WIP for C preprocessor
Date: Mon, 1 Jul 2024 10:02:17 -0400 (EDT)

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

    WIP for C preprocessor
---
 tree-sitter-fold-parsers.el |  9 ++++++-
 tree-sitter-fold.el         | 59 +++++++++++++++++++++++++++++++++------------
 2 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/tree-sitter-fold-parsers.el b/tree-sitter-fold-parsers.el
index 4de487fdf4..a9b9439904 100644
--- a/tree-sitter-fold-parsers.el
+++ b/tree-sitter-fold-parsers.el
@@ -40,6 +40,10 @@
 (declare-function tree-sitter-fold-range-block-comment "tree-sitter-fold.el")
 (declare-function tree-sitter-fold-c-like-comment "tree-sitter-fold.el")
 
+(declare-function tree-sitter-fold-range-c-preproc-def "tree-sitter-fold.el")
+(declare-function tree-sitter-fold-range-c-preproc-ifdef "tree-sitter-fold.el")
+(declare-function tree-sitter-fold-range-c-preproc-if "tree-sitter-fold.el")
+(declare-function tree-sitter-fold-range-c-preproc-else "tree-sitter-fold.el")
 (declare-function tree-sitter-fold-range-python "tree-sitter-fold.el")
 (declare-function tree-sitter-fold-range-rust-macro "tree-sitter-fold.el")
 
@@ -62,7 +66,10 @@
     (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)
+    (preproc_def            . tree-sitter-fold-range-c-preproc-def)
+    (preproc_if             . tree-sitter-fold-range-c-preproc-if)
+    (preproc_ifdef          . tree-sitter-fold-range-c-preproc-ifdef)
+    (preproc_else           . tree-sitter-fold-range-c-preproc-else)
     (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 7cced425fc..cd0b35412e 100644
--- a/tree-sitter-fold.el
+++ b/tree-sitter-fold.el
@@ -334,17 +334,6 @@ If the current syntax node is not foldable, do nothing."
 ;; (@* "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)))
@@ -355,6 +344,17 @@ Argument NODE is the starting node."
 If NEXT is non-nil, return next sibling.  Otherwirse, return previouse 
sibling."
   (if next (tsc-get-next-sibling node) (tsc-get-prev-sibling node)))
 
+(defun tree-sitter-fold--get-node-by-text (node text next)
+  "Return node with matching TEXT.
+Argument NODE is the starting node."
+  (let ((current (tree-sitter-fold--next-prev-node node next)) result)
+    (while current
+      (if (string= text (string-trim (tsc-node-text current)))
+          (setq result current
+                current nil)
+        (setq current (tree-sitter-fold--next-prev-node current next))))
+    result))
+
 (defun tree-sitter-fold--continuous-node-prefix (node prefix next)
   "Iterate through node starting from NODE and compare node-text to PREFIX;
 then return the last iterated node.
@@ -410,16 +410,45 @@ more information."
 ;; (@* "Languages" )
 ;;
 
-(defun tree-sitter-fold-range-c-preproc (node offset)
+(defun tree-sitter-fold-range-c-preproc-def (node offset)
+  ""
+  (when-let* ((named-node (tsc-get-child-by-field node :name))
+              (beg (tsc-node-end-position named-node))
+              (next (or (tree-sitter-fold--get-node-by-text node "#elif" t)
+                        (tree-sitter-fold--get-node-by-text node "#else" t)
+                        (tree-sitter-fold--get-node-by-text node "#endif" t)))
+              (end (1- (tsc-node-start-position next))))
+    (tree-sitter-fold-util--cons-add (cons beg end) offset)))
+
+(defun tree-sitter-fold-range-c-preproc-if (node offset)
+  ""
+  (when-let* ((named-node (tsc-get-child-by-field node :condition))
+              (beg (tsc-node-end-position named-node))
+              (next (or (tree-sitter-fold--get-node-by-text node "#elif" t)
+                        (tree-sitter-fold--get-node-by-text node "#else" t)
+                        (tree-sitter-fold--get-node-by-text node "#endif" t)))
+              (end (1- (tsc-node-start-position next))))
+    (tree-sitter-fold-util--cons-add (cons beg end) offset)))
+
+(defun tree-sitter-fold-range-c-preproc-ifdef (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))))
+              (next (or (tree-sitter-fold--get-node-by-text node "#elif" t)
+                        (tree-sitter-fold--get-node-by-text node "#else" t)
+                        (tree-sitter-fold--get-node-by-text node "#endif" t)))
+              (end (1- (tsc-node-start-position next))))
+    (tree-sitter-fold-util--cons-add (cons beg end) offset)))
+
+(defun tree-sitter-fold-range-c-preproc-else (node offset)
+  ""
+  (when-let* ((beg (tsc-node-end-position node))
+              (next (tree-sitter-fold--get-node-by-text node "#endif" t))
+              (end (1- (tsc-node-start-position next))))
     (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'.
+  "Define fold range for `function_definition' and `class_definition'.
 
 For arguments NODE and OFFSET, see function `tree-sitter-fold-range-seq' for
 more information."



reply via email to

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