branch: elpa/treesit-fold
commit 35b62011cb8ae2f85adb00080a0a9e040eee5c87
Author: JenChieh <[email protected]>
Commit: JenChieh <[email protected]>

    feat: Add F# support
---
 README.md               |   2 +-
 treesit-fold-parsers.el |  10 ++++
 treesit-fold-summary.el |   6 +++
 treesit-fold.el         | 120 ++++++++++++++++++++++++++++--------------------
 4 files changed, 88 insertions(+), 50 deletions(-)

diff --git a/README.md b/README.md
index a523d9334d8..64058907dd0 100644
--- a/README.md
+++ b/README.md
@@ -127,7 +127,7 @@ These languages are fairly complete:
 - C / C++ / C# / Clojure / CMake / CSS
 - Dart
 - Elisp / Elixir / Erlang
-- Fish
+- Fish / F#
 - GDScript / Gleam / GLSL / Go / GraphQL / Groovy (Jenkinsfile)
 - Haskell / Haxe / HEEx / HLSL / HTML
 - Jai / Janet / Java / JavaScript / JSX / JSON / Jsonnet / Julia
diff --git a/treesit-fold-parsers.el b/treesit-fold-parsers.el
index d877e4251f9..bfa921118a2 100644
--- a/treesit-fold-parsers.el
+++ b/treesit-fold-parsers.el
@@ -54,6 +54,8 @@
 (declare-function treesit-fold-range-fish-function "treesit-fold.el")
 (declare-function treesit-fold-range-fish-if "treesit-fold.el")
 (declare-function treesit-fold-range-fish-case "treesit-fold.el")
+(declare-function treesit-fold-range-fsharp-module-defn "treesit-fold.el")
+(declare-function treesit-fold-range-fsharp-record-type-defn "treesit-fold.el")
 (declare-function treesit-fold-range-haskell-function "treesit-fold.el")
 (declare-function treesit-fold-range-html "treesit-fold.el")
 (declare-function treesit-fold-range-julia-function "treesit-fold.el")
@@ -276,6 +278,14 @@
      . (lambda (node offset)
          (treesit-fold-range-line-comment node offset "#")))))
 
+(defun treesit-fold-parsers-fsharp ()
+  "Rules set for F#."
+  '((module_defn      . treesit-fold-range-fsharp-module-defn)
+    (list_expression  . treesit-fold-range-seq)
+    (record_type_defn . treesit-fold-range-fsharp-record-type-defn)
+    (line_comment     . treesit-fold-range-c-like-comment)
+    (block_comment    . (treesit-fold-range-seq 1 -1))))
+
 (defun treesit-fold-parsers-gdscript ()
   "Rule set for GGScript."
   '((body . (treesit-fold-range-seq -1 1))
diff --git a/treesit-fold-summary.el b/treesit-fold-summary.el
index b670237bad7..01900d6c34a 100644
--- a/treesit-fold-summary.el
+++ b/treesit-fold-summary.el
@@ -190,6 +190,10 @@ type of content by checking the word boundary's existence."
   "Extract summary from DOC-STR in Julia."
   (treesit-fold-summary--generic doc-str '("#" "\"\"\"")))
 
+(defun treesit-fold-summary-ocaml (doc-str)
+  "Extract summary from DOC-STR in OCaml."
+  (treesit-fold-summary--generic doc-str '("\"\"")))
+
 ;;
 ;; (@* "Core" )
 ;;
@@ -207,6 +211,7 @@ type of content by checking the word boundary's existence."
     (beancount-mode         . treesit-fold-summary-elisp)
     (c-mode                 . treesit-fold-summary-c)
     (c++-mode               . treesit-fold-summary-c)
+    (caml-mode              . treesit-fold-summary-ocaml)
     (cmake-mode             . treesit-fold-summary-ruby-doc)
     (clojure-mode           . treesit-fold-summary-elisp)
     (clojure-ts-mode        . treesit-fold-summary-elisp)
@@ -221,6 +226,7 @@ type of content by checking the word boundary's existence."
     (elixir-mode            . treesit-fold-summary-ruby-doc)
     (erlang-mode            . treesit-fold-summary-tex-doc)
     (fish-mode              . treesit-fold-summary-javadoc)
+    (fsharp-mode            . treesit-fold-summary-ocaml)
     (gdscript-mode          . treesit-fold-summary-ruby-doc)
     (gdscript-ts-mode       . treesit-fold-summary-ruby-doc)
     (glsl-mode              . treesit-fold-summary-c)
diff --git a/treesit-fold.el b/treesit-fold.el
index baf52e3cb7a..7440787f597 100644
--- a/treesit-fold.el
+++ b/treesit-fold.el
@@ -96,6 +96,8 @@
     (erlang-ts-mode         . ,(treesit-fold-parsers-erlang))
     (ess-r-mode             . ,(treesit-fold-parsers-r))
     (fish-mode              . ,(treesit-fold-parsers-fish))
+    (fsharp-mode            . ,(treesit-fold-parsers-fsharp))
+    (fsharp-ts-mode         . ,(treesit-fold-parsers-fsharp))
     (gdscript-mode          . ,(treesit-fold-parsers-gdscript))
     (gdscript-ts-mode       . ,(treesit-fold-parsers-gdscript))
     (gleam-ts-mode          . ,(treesit-fold-parsers-gleam))
@@ -514,14 +516,14 @@ current `major-mode'.
 If no NODE is found in point, do nothing."
   (interactive)
   (treesit-fold--ensure-ts
-    (when-let* ((node (or node (treesit-fold--foldable-node-at-pos))))
-      ;; make sure I do not create multiple overlays for the same fold
-      (when-let* ((ov (treesit-fold-overlay-at node)))
-        (delete-overlay ov))
-      (when-let* ((range (treesit-fold--get-fold-range node))
-                  (ov (treesit-fold--create-overlay range)))
-        (run-hooks 'treesit-fold-on-fold-hook)
-        ov))))
+   (when-let* ((node (or node (treesit-fold--foldable-node-at-pos))))
+     ;; make sure I do not create multiple overlays for the same fold
+     (when-let* ((ov (treesit-fold-overlay-at node)))
+       (delete-overlay ov))
+     (when-let* ((range (treesit-fold--get-fold-range node))
+                 (ov (treesit-fold--create-overlay range)))
+       (run-hooks 'treesit-fold-on-fold-hook)
+       ov))))
 
 ;;;###autoload
 (defun treesit-fold-open ()
@@ -529,58 +531,58 @@ If no NODE is found in point, do nothing."
 If the current node is not folded or not foldable, do nothing."
   (interactive)
   (treesit-fold--ensure-ts
-    (when-let* ((node (treesit-fold--foldable-node-at-pos))
-                (ov (treesit-fold-overlay-at node)))
-      (delete-overlay ov)
-      (run-hooks 'treesit-fold-on-fold-hook)
-      t)))
+   (when-let* ((node (treesit-fold--foldable-node-at-pos))
+               (ov (treesit-fold-overlay-at node)))
+     (delete-overlay ov)
+     (run-hooks 'treesit-fold-on-fold-hook)
+     t)))
 
 ;;;###autoload
 (defun treesit-fold-open-recursively ()
   "Open recursively folded syntax NODE that are contained in the node at 
point."
   (interactive)
   (treesit-fold--ensure-ts
-    (when-let* ((node (treesit-fold--foldable-node-at-pos))
-                (beg (treesit-node-start node))
-                (end (treesit-node-end node))
-                (nodes (treesit-fold--overlays-in 'invisible 'treesit-fold beg 
end)))
-      (mapc #'delete-overlay nodes)
-      (run-hooks 'treesit-fold-on-fold-hook)
-      t)))
+   (when-let* ((node (treesit-fold--foldable-node-at-pos))
+               (beg (treesit-node-start node))
+               (end (treesit-node-end node))
+               (nodes (treesit-fold--overlays-in 'invisible 'treesit-fold beg 
end)))
+     (mapc #'delete-overlay nodes)
+     (run-hooks 'treesit-fold-on-fold-hook)
+     t)))
 
 ;;;###autoload
 (defun treesit-fold-close-all ()
   "Fold all foldable syntax nodes in the buffer."
   (interactive)
   (treesit-fold--ensure-ts
-    (let (nodes)
-      (let* ((treesit-fold-indicators-mode)
-             (treesit-fold-on-fold-hook)
-             (node (treesit-buffer-root-node))
-             (patterns (seq-mapcat (lambda (fold-range) `((,(car fold-range)) 
@name))
-                                   (alist-get major-mode 
treesit-fold-range-alist)))
-             (query (treesit-query-compile (treesit-node-language node) 
patterns)))
-        (setq nodes (treesit-query-capture node query)
-              nodes (cl-remove-if (lambda (node)
-                                    ;; Removed if on same line
-                                    (treesit-fold--node-range-on-same-line 
(cdr node)))
-                                  nodes))
-        (thread-last nodes
-                     (mapcar #'cdr)
-                     (mapc #'treesit-fold-close)))
-      (when nodes
-        (run-hooks 'treesit-fold-on-fold-hook)
-        t))))
+   (let (nodes)
+     (let* ((treesit-fold-indicators-mode)
+            (treesit-fold-on-fold-hook)
+            (node (treesit-buffer-root-node))
+            (patterns (seq-mapcat (lambda (fold-range) `((,(car fold-range)) 
@name))
+                                  (alist-get major-mode 
treesit-fold-range-alist)))
+            (query (treesit-query-compile (treesit-node-language node) 
patterns)))
+       (setq nodes (treesit-query-capture node query)
+             nodes (cl-remove-if (lambda (node)
+                                   ;; Removed if on same line
+                                   (treesit-fold--node-range-on-same-line (cdr 
node)))
+                                 nodes))
+       (thread-last nodes
+                    (mapcar #'cdr)
+                    (mapc #'treesit-fold-close)))
+     (when nodes
+       (run-hooks 'treesit-fold-on-fold-hook)
+       t))))
 
 ;;;###autoload
 (defun treesit-fold-open-all ()
   "Unfold all syntax nodes in the buffer."
   (interactive)
   (treesit-fold--ensure-ts
-    (when-let* ((nodes (treesit-fold--overlays-in 'invisible 'treesit-fold)))
-      (mapc #'delete-overlay nodes)
-      (run-hooks 'treesit-fold-on-fold-hook)
-      t)))
+   (when-let* ((nodes (treesit-fold--overlays-in 'invisible 'treesit-fold)))
+     (mapc #'delete-overlay nodes)
+     (run-hooks 'treesit-fold-on-fold-hook)
+     t)))
 
 ;;;###autoload
 (defun treesit-fold-toggle ()
@@ -588,13 +590,13 @@ If the current node is not folded or not foldable, do 
nothing."
 If the current syntax node is not foldable, do nothing."
   (interactive)
   (treesit-fold--ensure-ts
-    (if-let* ((node (treesit-fold--foldable-node-at-pos (point)))
-              (ov (treesit-fold-overlay-at node)))
-        (progn
-          (delete-overlay ov)
-          (run-hooks 'treesit-fold-on-fold-hook)
-          t)
-      (treesit-fold-close))))
+   (if-let* ((node (treesit-fold--foldable-node-at-pos (point)))
+             (ov (treesit-fold-overlay-at node)))
+       (progn
+         (delete-overlay ov)
+         (run-hooks 'treesit-fold-on-fold-hook)
+         t)
+     (treesit-fold-close))))
 
 (defun treesit-fold--after-command (&rest _)
   "Function call after interactive commands."
@@ -942,6 +944,26 @@ more information."
               (end (1- end)))
     (treesit-fold--cons-add (cons beg end) offset)))
 
+(defun treesit-fold-range-fsharp-module-defn (node offset)
+  "Define fold range for `module_defn' in FSharp.
+
+For arguments NODE and OFFSET, see function `treesit-fold-range-seq' for
+more information."
+  (when-let* ((beg (car (treesit-fold-find-children node "=")))
+              (beg (treesit-node-end beg))
+              (end (treesit-node-end node)))
+    (treesit-fold--cons-add (cons beg end) offset)))
+
+(defun treesit-fold-range-fsharp-record-type-defn (node offset)
+  "Define fold range for `record_type_defn' in FSharp.
+
+For arguments NODE and OFFSET, see function `treesit-fold-range-seq' for
+more information."
+  (when-let* ((beg (car (treesit-fold-find-children node "{")))
+              (beg (treesit-node-end beg))
+              (end (1- (treesit-node-end node))))
+    (treesit-fold--cons-add (cons beg end) offset)))
+
 (defun treesit-fold-range-gleam (node offset)
   "Return the fold range for `function' `type_definition' NODE in Gleam.
 

Reply via email to