branch: elpa/treesit-fold
commit 058c57c42f3c1e67c924b908dcbc127450d7f24f
Author: Jen-Chieh Shen <[email protected]>
Commit: GitHub <[email protected]>

    feat: Add Crystal support (#45)
---
 CHANGELOG.md            |  1 +
 README.md               |  2 +-
 treesit-fold-parsers.el | 12 ++++++++++++
 treesit-fold-summary.el |  2 ++
 treesit-fold.el         | 15 +++++++++++++++
 5 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 71fd477ea49..39f7a9a18aa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,7 @@ Check [Keep a Changelog](http://keepachangelog.com/) for 
recommendations on how
 * feat: Add `Wasm Text` support ([#42](../../pull/42))
 * feat: Add `WGSL` support ([#43](../../pull/43))
 * feat: Add `GDShader` support ([#44](../../pull/44))
+* feat: Add `Crystal` support ([#45](../../pull/45))
 
 ## 0.2.0
 > Released Feb 12, 2025
diff --git a/README.md b/README.md
index 7df921e2685..b968b865703 100644
--- a/README.md
+++ b/README.md
@@ -124,7 +124,7 @@ These languages are fairly complete:
 
 - ActionScript / Arduino / Assembly
 - Bash / Beancount
-- C / C++ / C# / Clojure / CMake / CSS
+- C / C++ / C# / Clojure / CMake / Crystal / CSS
 - Dart
 - Elisp / Elixir / Erlang
 - F# / Fish / Fennel
diff --git a/treesit-fold-parsers.el b/treesit-fold-parsers.el
index 513c052d144..8b4a090bd83 100644
--- a/treesit-fold-parsers.el
+++ b/treesit-fold-parsers.el
@@ -91,6 +91,7 @@
 (declare-function treesit-fold-range-org-body "treesit-fold.el")
 (declare-function treesit-fold-range-clojure-function "treesit-fold.el")
 (declare-function treesit-fold-range-cmake-body "treesit-fold.el")
+(declare-function treesit-fold-range-crystal-block "treesit-fold.el")
 (declare-function treesit-fold-range-editorconfig-section "treesit-fold.el")
 (declare-function treesit-fold-range-pascal-comment "treesit-fold.el")
 (declare-function treesit-fold-range-python-block "treesit-fold.el")
@@ -201,6 +202,17 @@
      . (lambda (node offset)
          (treesit-fold-range-line-comment node offset "#")))))
 
+(defun treesit-fold-parsers-crystal ()
+  "Rule set for Crystal."
+  '((block      . treesit-fold-range-crystal-block)
+    (method_def . treesit-fold-range-crystal-block)
+    (while      . treesit-fold-range-crystal-block)
+    (call       . treesit-fold-range-crystal-block)
+    (until      . treesit-fold-range-crystal-block)
+    (comment
+     . (lambda (node offset)
+         (treesit-fold-range-line-comment node offset "#")))))
+
 (defun treesit-fold-parsers-csharp ()
   "Rule set for C#."
   '((block                                . treesit-fold-range-seq)
diff --git a/treesit-fold-summary.el b/treesit-fold-summary.el
index 52f5bad061b..92be3bee78c 100644
--- a/treesit-fold-summary.el
+++ b/treesit-fold-summary.el
@@ -215,6 +215,8 @@ type of content by checking the word boundary's existence."
     (cmake-mode             . treesit-fold-summary-ruby-doc)
     (clojure-mode           . treesit-fold-summary-elisp)
     (clojure-ts-mode        . treesit-fold-summary-elisp)
+    (crystal-mode           . treesit-fold-summary-ruby-doc)
+    (crystal-ts-mode        . treesit-fold-summary-ruby-doc)
     (csharp-mode            . treesit-fold-summary-csharp)
     (csharp-ts-mode         . treesit-fold-summary-csharp)
     (css-mode               . treesit-fold-summary-javadoc)
diff --git a/treesit-fold.el b/treesit-fold.el
index cd2610893f9..772bd2b9089 100644
--- a/treesit-fold.el
+++ b/treesit-fold.el
@@ -83,6 +83,8 @@
     (cmake-ts-mode          . ,(treesit-fold-parsers-cmake))
     (clojure-mode           . ,(treesit-fold-parsers-clojure))
     (clojure-ts-mode        . ,(treesit-fold-parsers-clojure))
+    (crystal-mode           . ,(treesit-fold-parsers-crystal))
+    (crystal-ts-mode        . ,(treesit-fold-parsers-crystal))
     (csharp-mode            . ,(treesit-fold-parsers-csharp))
     (csharp-ts-mode         . ,(treesit-fold-parsers-csharp))
     (css-mode               . ,(treesit-fold-parsers-css))
@@ -842,6 +844,19 @@ more information."
       (setq end (treesit-fold--last-eol end)))
     (treesit-fold--cons-add (cons beg end) offset)))
 
+(defun treesit-fold-range-crystal-block (node offset)
+  "Return the fold range for `block' NODE in Crystal.
+
+For arguments NODE and OFFSET, see function `treesit-fold-range-seq' for
+more information."
+  (when-let* ((expr (car (treesit-fold-find-children node "expressions")))
+              (prev (treesit-node-prev-sibling expr))
+              (beg (treesit-node-end prev))
+              (end (treesit-node-end expr)))
+    (when treesit-fold-on-next-line  ; display nicely
+      (setq end (treesit-fold--last-eol end)))
+    (treesit-fold--cons-add (cons beg end) offset)))
+
 (defun treesit-fold-range-editorconfig-end-section (node)
   "Return the section NODE's end point."
   (let ((pt (treesit-node-end node))

Reply via email to