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))