Skip to content

Commit 9706799

Browse files
Support for treesit.el
* Add support for treesit.el from @abougouffa fork (thank you!). * Allow unfold by clicking fold-replacement.
1 parent cc31fb5 commit 9706799

File tree

5 files changed

+312
-271
lines changed

5 files changed

+312
-271
lines changed

treesit-fold-indicators.el

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@
121121
"Enable `treesit-fold-indicators' mode."
122122
(if (or treesit-fold-mode (treesit-fold-mode 1)) ; Enable `treesit-fold-mode' automatically
123123
(progn
124-
(add-hook 'tree-sitter-after-change-functions #'treesit-fold-indicators-refresh nil t)
124+
(add-hook 'after-change-functions #'treesit-fold-indicators-refresh nil t)
125125
(add-hook 'after-save-hook #'treesit-fold-indicators-refresh nil t)
126126
(add-hook 'window-size-change-functions #'treesit-fold-indicators--size-change)
127127
(add-hook 'window-scroll-functions #'treesit-fold-indicators--scroll)
@@ -130,7 +130,7 @@
130130

131131
(defun treesit-fold-indicators--disable ()
132132
"Disable `treesit-fold-indicators' mode."
133-
(remove-hook 'tree-sitter-after-change-functions #'treesit-fold-indicators-refresh t)
133+
(remove-hook 'after-change-functions #'treesit-fold-indicators-refresh t)
134134
(remove-hook 'after-save-hook #'treesit-fold-indicators-refresh t)
135135
(remove-hook 'window-size-change-functions #'treesit-fold-indicators--size-change)
136136
(remove-hook 'window-scroll-functions #'treesit-fold-indicators--scroll)
@@ -143,14 +143,13 @@
143143
:lighter nil
144144
:keymap treesit-fold-indicators-mode-map
145145
:init-value nil
146-
(tree-sitter--handle-dependent treesit-fold-indicators-mode
147-
#'treesit-fold-indicators--enable
148-
#'treesit-fold-indicators--disable))
146+
(if treesit-fold-indicators-mode
147+
(treesit-fold-indicators--enable)
148+
(treesit-fold-indicators--disable)))
149149

150150
;;;###autoload
151151
(define-minor-mode global-treesit-fold-indicators-mode
152-
"Global minor mode for turning on treesit-fold with indicators
153-
whenever avaliable."
152+
"Global minor mode for turning on treesit-fold with indicators whenever avaliable."
154153
:group 'treesit-fold
155154
:lighter nil
156155
:init-value nil
@@ -329,8 +328,8 @@ Optional arguments WEND and WSTART are the range for caching."
329328
(range (cl-case treesit-fold-indicators-render-method
330329
(`full
331330
(ignore-errors (treesit-fold--get-fold-range node)))
332-
(`partial (cons (tsc-node-start-position node)
333-
(tsc-node-end-position node)))
331+
(`partial (cons (treesit-node-start node)
332+
(treesit-node-end node)))
334333
(t
335334
(user-error "Invalid render method: %s" treesit-fold-indicators-render-method))))
336335
(start (car range))
@@ -343,16 +342,15 @@ Optional arguments WEND and WSTART are the range for caching."
343342
;;;###autoload
344343
(defun treesit-fold-indicators-refresh (&rest _)
345344
"Refresh indicators for all folding range."
346-
(when (and tree-sitter-mode treesit-fold-indicators-mode)
345+
(when (and (ignore-errors (treesit-buffer-root-node)) treesit-fold-indicators-mode)
347346
(treesit-fold--ensure-ts
348347
(when-let*
349-
((node (ignore-errors (tsc-root-node tree-sitter-tree)))
348+
((node (ignore-errors (treesit-buffer-root-node)))
350349
(patterns (seq-mapcat (lambda (fold-range) `((,(car fold-range)) @name))
351-
(alist-get major-mode treesit-fold-range-alist)
352-
'vector))
350+
(alist-get major-mode treesit-fold-range-alist)))
353351
(query (ignore-errors
354-
(tsc-make-query tree-sitter-language patterns)))
355-
(nodes-to-fold (tsc-query-captures query node #'ignore))
352+
(treesit-query-compile (treesit-node-language node) patterns)))
353+
(nodes-to-fold (treesit-query-capture node query))
356354
(wend (window-end nil t))
357355
(wstart (window-start))
358356
(nodes-to-fold

treesit-fold-parsers.el

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
;; (@* "Parsers" )
104104
;;
105105

106+
;; Should these functions be variables?
106107
;; TODO(everyone): keep the function alphabetically sorted
107108

108109
(defun treesit-fold-parsers-actionscript ()
@@ -125,7 +126,7 @@
125126
(block_comment . treesit-fold-range-c-like-comment)
126127
(line_comment
127128
. (lambda (node offset)
128-
(let ((text (tsc-node-text node)))
129+
(let ((text (treesit-node-text node)))
129130
(cond ((string-prefix-p ";;" text)
130131
(treesit-fold-range-line-comment node offset ";;"))
131132
((string-prefix-p "#" text)
@@ -523,17 +524,18 @@
523524
(compound_statement . treesit-fold-range-seq)
524525
(comment
525526
. (lambda (node offset)
526-
(if (string-prefix-p "#" (tsc-node-text node))
527+
(if (string-prefix-p "#" (treesit-node-text node))
527528
(treesit-fold-range-line-comment node offset "#")
528529
(treesit-fold-range-c-like-comment node offset))))))
529530

530531
(defun treesit-fold-parsers-python ()
531532
"Rule set for Python."
532-
'((function_definition . treesit-fold-range-python-def)
533-
(class_definition . treesit-fold-range-python-def)
534-
(list . treesit-fold-range-seq)
535-
(dictionary . treesit-fold-range-seq)
536-
(expression_statement . treesit-fold-range-python-expression-statement)
533+
'((function_definition . treesit-fold-range-python-def)
534+
(class_definition . treesit-fold-range-python-def)
535+
(list . treesit-fold-range-seq)
536+
(dictionary . treesit-fold-range-seq)
537+
(parenthesized_expression . treesit-fold-range-seq)
538+
(expression_statement . treesit-fold-range-python-expression-statement)
537539
(comment
538540
. (lambda (node offset)
539541
(treesit-fold-range-line-comment node offset "#")))))

treesit-fold-summary.el

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ type of content by checking the word boundary's existence."
105105
(defun treesit-fold-summary-csharp-vsdoc (doc-str)
106106
"Extract summary from DOC-STR in C# vsdoc."
107107
(let ((type-triple (string-match-p "///" doc-str)))
108-
(setq doc-str (s-replace-regexp "<[/]*[^>]+." "" doc-str))
108+
(setq doc-str (s-replace-regexp "<[/]*[^>]+." "" doc-str)) ; should use `replace-regexp-in-string'?
109109
(treesit-fold-summary--generic doc-str (if type-triple "///" "//"))))
110110

111111
(defun treesit-fold-summary-csharp (doc-str)

treesit-fold-util.el

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525

2626
;;; Code:
2727

28-
(require 'tsc)
29-
3028
;;
3129
;; (@* "Redisplay" )
3230
;;
@@ -174,52 +172,39 @@ See macro `with-selected-window' description for arguments WINDOW and BODY."
174172

175173
(defun treesit-fold--compare-type (node type)
176174
"Compare NODE's type to TYPE."
177-
;; tsc-node-type returns a symbol or a string and `string=' automatically
178-
;; converts symbols to strings
179-
(string= (tsc-node-type node) type))
180-
181-
(defun treesit-fold-get-children (node)
182-
"Get list of direct children of NODE."
183-
(let (children)
184-
(dotimes (index (tsc-count-children node))
185-
(push (tsc-get-nth-child node index) children))
186-
(reverse children)))
187-
188-
(defun treesit-fold-get-children-traverse (node)
189-
"Return children from NODE but traverse it."
190-
(let (nodes)
191-
(tsc-traverse-mapc (lambda (child) (push child nodes)) node)
192-
(reverse nodes)))
175+
(string= (treesit-node-type node) type))
193176

194177
(defun treesit-fold-find-children (node type)
195178
"Search through the children of NODE to find all with type equal to TYPE;
196179
then return that list."
197180
(cl-remove-if-not (lambda (child) (treesit-fold--compare-type child type))
198-
(treesit-fold-get-children node)))
181+
(treesit-node-children node)))
199182

200-
(defun treesit-fold-find-children-traverse (node type)
201-
"Like function `treesit-fold-find-children' but traverse it.
183+
(defalias 'treesit-fold-find-children-traverse #'treesit-fold-find-children)
202184

203-
For arguments NODE and TYPE, see function `treesit-fold-find-children' for more
204-
information."
205-
(cl-remove-if-not (lambda (child) (treesit-fold--compare-type child type))
206-
(treesit-fold-get-children-traverse node)))
185+
;; (defun treesit-fold-find-children-traverse (node type)
186+
;; "Like function `treesit-fold-find-children' but traverse it.
187+
188+
;; For arguments NODE and TYPE, see function `treesit-fold-find-children' for more
189+
;; information."
190+
;; (cl-remove-if-not (lambda (child) (treesit-fold--compare-type child type))
191+
;; (treesit-fold-get-children-traverse node)))
207192

208193
(defun treesit-fold-find-parent (node type)
209194
"Find the TYPE of parent from NODE."
210-
(let ((parent (tsc-get-parent node))
195+
(let ((parent (treesit-node-parent node))
211196
(break))
212197
(while (and parent (not break))
213198
(setq break (treesit-fold--compare-type parent type))
214199
(unless break
215-
(setq parent (tsc-get-parent parent))))
200+
(setq parent (treesit-node-parent parent))))
216201
parent))
217202

218203
(defun treesit-fold-last-child (node)
219204
"Return last child node from parent NODE."
220-
(when-let* ((count (tsc-count-children node))
205+
(when-let* ((count (treesit-node-child-count node))
221206
((not (= count 0))))
222-
(tsc-get-nth-child node (1- count))))
207+
(treesit-node-child node (1- count))))
223208

224209
(provide 'treesit-fold-util)
225210
;;; treesit-fold-util.el ends here

0 commit comments

Comments
 (0)