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.