aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRandy Taylor2024-01-24 21:39:45 -0500
committerYuan Fu2024-01-26 20:41:17 -0800
commit1ef8b90ae06d698ab2ba9b43f67fde7289db2c5d (patch)
tree7c1d41360a696b0a71b60b5ce57209cd6500bcc2
parent7338af9c9862f7581f8a246efbd2ee35040b0219 (diff)
downloademacs-1ef8b90ae06d698ab2ba9b43f67fde7289db2c5d.tar.gz
emacs-1ef8b90ae06d698ab2ba9b43f67fde7289db2c5d.zip
Simplify imenu setup for {cmake,dockerfile}-ts-modes
* lisp/progmodes/cmake-ts-mode.el (treesit-induce-sparse-tree, treesit-node-child, treesit-node-start, cmake-ts-mode--imenu, cmake-ts-mode--imenu-1): Remove. (treesit-search-subtree): Declare. (cmake-ts-mode--function-name): New function. (cmake-ts-mode): Use it. * lisp/progmodes/dockerfile-ts-mode.el (treesit-induce-sparse-tree, treesit-node-start, dockerfile-ts-mode--imenu, dockerfile-ts-mode--imenu-1): Remove. (dockerfile-ts-mode--stage-name): New function. (dockerfile-ts-mode): Use it.
-rw-r--r--lisp/progmodes/cmake-ts-mode.el46
-rw-r--r--lisp/progmodes/dockerfile-ts-mode.el47
2 files changed, 22 insertions, 71 deletions
diff --git a/lisp/progmodes/cmake-ts-mode.el b/lisp/progmodes/cmake-ts-mode.el
index d933e4ebb81..29c9e957d3c 100644
--- a/lisp/progmodes/cmake-ts-mode.el
+++ b/lisp/progmodes/cmake-ts-mode.el
@@ -32,10 +32,8 @@
32 32
33(declare-function treesit-parser-create "treesit.c") 33(declare-function treesit-parser-create "treesit.c")
34(declare-function treesit-query-capture "treesit.c") 34(declare-function treesit-query-capture "treesit.c")
35(declare-function treesit-induce-sparse-tree "treesit.c")
36(declare-function treesit-node-child "treesit.c")
37(declare-function treesit-node-start "treesit.c")
38(declare-function treesit-node-type "treesit.c") 35(declare-function treesit-node-type "treesit.c")
36(declare-function treesit-search-subtree "treesit.c")
39 37
40(defcustom cmake-ts-mode-indent-offset 2 38(defcustom cmake-ts-mode-indent-offset 2
41 "Number of spaces for each indentation step in `cmake-ts-mode'." 39 "Number of spaces for each indentation step in `cmake-ts-mode'."
@@ -195,37 +193,14 @@ Check if a node type is available, then return the right font lock rules."
195 '((ERROR) @font-lock-warning-face)) 193 '((ERROR) @font-lock-warning-face))
196 "Tree-sitter font-lock settings for `cmake-ts-mode'.") 194 "Tree-sitter font-lock settings for `cmake-ts-mode'.")
197 195
198(defun cmake-ts-mode--imenu () 196(defun cmake-ts-mode--function-name (node)
199 "Return Imenu alist for the current buffer." 197 "Return the function name of NODE.
200 (let* ((node (treesit-buffer-root-node)) 198Return nil if there is no name or if NODE is not a function node."
201 (func-tree (treesit-induce-sparse-tree 199 (pcase (treesit-node-type node)
202 node "function_def" nil 1000)) 200 ("function_command"
203 (func-index (cmake-ts-mode--imenu-1 func-tree))) 201 (treesit-node-text
204 (append 202 (treesit-search-subtree node "^argument$" nil nil 2)
205 (when func-index `(("Function" . ,func-index)))))) 203 t))))
206
207(defun cmake-ts-mode--imenu-1 (node)
208 "Helper for `cmake-ts-mode--imenu'.
209Find string representation for NODE and set marker, then recurse
210the subtrees."
211 (let* ((ts-node (car node))
212 (children (cdr node))
213 (subtrees (mapcan #'cmake-ts-mode--imenu-1
214 children))
215 (name (when ts-node
216 (pcase (treesit-node-type ts-node)
217 ("function_def"
218 (treesit-node-text
219 (treesit-node-child (treesit-node-child ts-node 0) 2) t)))))
220 (marker (when ts-node
221 (set-marker (make-marker)
222 (treesit-node-start ts-node)))))
223 (cond
224 ((or (null ts-node) (null name)) subtrees)
225 (subtrees
226 `((,name ,(cons name marker) ,@subtrees)))
227 (t
228 `((,name . ,marker))))))
229 204
230;;;###autoload 205;;;###autoload
231(define-derived-mode cmake-ts-mode prog-mode "CMake" 206(define-derived-mode cmake-ts-mode prog-mode "CMake"
@@ -242,7 +217,8 @@ the subtrees."
242 (setq-local comment-start-skip (rx "#" (* (syntax whitespace)))) 217 (setq-local comment-start-skip (rx "#" (* (syntax whitespace))))
243 218
244 ;; Imenu. 219 ;; Imenu.
245 (setq-local imenu-create-index-function #'cmake-ts-mode--imenu) 220 (setq-local treesit-simple-imenu-settings
221 `(("Function" "\\`function_command\\'" nil cmake-ts-mode--function-name)))
246 (setq-local which-func-functions nil) 222 (setq-local which-func-functions nil)
247 223
248 ;; Indent. 224 ;; Indent.
diff --git a/lisp/progmodes/dockerfile-ts-mode.el b/lisp/progmodes/dockerfile-ts-mode.el
index d5b7f953e31..878335431af 100644
--- a/lisp/progmodes/dockerfile-ts-mode.el
+++ b/lisp/progmodes/dockerfile-ts-mode.el
@@ -31,10 +31,8 @@
31(eval-when-compile (require 'rx)) 31(eval-when-compile (require 'rx))
32 32
33(declare-function treesit-parser-create "treesit.c") 33(declare-function treesit-parser-create "treesit.c")
34(declare-function treesit-induce-sparse-tree "treesit.c")
35(declare-function treesit-node-child "treesit.c") 34(declare-function treesit-node-child "treesit.c")
36(declare-function treesit-node-child-by-field-name "treesit.c") 35(declare-function treesit-node-child-by-field-name "treesit.c")
37(declare-function treesit-node-start "treesit.c")
38(declare-function treesit-node-type "treesit.c") 36(declare-function treesit-node-type "treesit.c")
39 37
40(defvar dockerfile-ts-mode--syntax-table 38(defvar dockerfile-ts-mode--syntax-table
@@ -118,38 +116,15 @@ continuation to the previous entry."
118 '((ERROR) @font-lock-warning-face)) 116 '((ERROR) @font-lock-warning-face))
119 "Tree-sitter font-lock settings.") 117 "Tree-sitter font-lock settings.")
120 118
121(defun dockerfile-ts-mode--imenu () 119(defun dockerfile-ts-mode--stage-name (node)
122 "Return Imenu alist for the current buffer." 120 "Return the stage name of NODE.
123 (let* ((node (treesit-buffer-root-node)) 121Return nil if there is no name or if NODE is not a stage node."
124 (stage-tree (treesit-induce-sparse-tree 122 (pcase (treesit-node-type node)
125 node "from_instruction" 123 ("from_instruction"
126 nil 1000)) 124 (treesit-node-text
127 (stage-index (dockerfile-ts-mode--imenu-1 stage-tree))) 125 (or (treesit-node-child-by-field-name node "as")
128 (when stage-index `(("Stage" . ,stage-index))))) 126 (treesit-node-child node 1))
129 127 t))))
130(defun dockerfile-ts-mode--imenu-1 (node)
131 "Helper for `dockerfile-ts-mode--imenu'.
132Find string representation for NODE and set marker, then recurse
133the subtrees."
134 (let* ((ts-node (car node))
135 (children (cdr node))
136 (subtrees (mapcan #'dockerfile-ts-mode--imenu-1
137 children))
138 (name (when ts-node
139 (pcase (treesit-node-type ts-node)
140 ("from_instruction"
141 (treesit-node-text
142 (or (treesit-node-child-by-field-name ts-node "as")
143 (treesit-node-child ts-node 1)) t)))))
144 (marker (when ts-node
145 (set-marker (make-marker)
146 (treesit-node-start ts-node)))))
147 (cond
148 ((or (null ts-node) (null name)) subtrees)
149 (subtrees
150 `((,name ,(cons name marker) ,@subtrees)))
151 (t
152 `((,name . ,marker))))))
153 128
154;;;###autoload 129;;;###autoload
155(define-derived-mode dockerfile-ts-mode prog-mode "Dockerfile" 130(define-derived-mode dockerfile-ts-mode prog-mode "Dockerfile"
@@ -166,8 +141,8 @@ the subtrees."
166 (setq-local comment-start-skip (rx "#" (* (syntax whitespace)))) 141 (setq-local comment-start-skip (rx "#" (* (syntax whitespace))))
167 142
168 ;; Imenu. 143 ;; Imenu.
169 (setq-local imenu-create-index-function 144 (setq-local treesit-simple-imenu-settings
170 #'dockerfile-ts-mode--imenu) 145 `(("Stage" "\\`from_instruction\\'" nil dockerfile-ts-mode--stage-name)))
171 (setq-local which-func-functions nil) 146 (setq-local which-func-functions nil)
172 147
173 ;; Indent. 148 ;; Indent.