diff options
| author | Randy Taylor | 2024-01-24 21:39:45 -0500 |
|---|---|---|
| committer | Yuan Fu | 2024-01-26 20:41:17 -0800 |
| commit | 1ef8b90ae06d698ab2ba9b43f67fde7289db2c5d (patch) | |
| tree | 7c1d41360a696b0a71b60b5ce57209cd6500bcc2 | |
| parent | 7338af9c9862f7581f8a246efbd2ee35040b0219 (diff) | |
| download | emacs-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.el | 46 | ||||
| -rw-r--r-- | lisp/progmodes/dockerfile-ts-mode.el | 47 |
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)) | 198 | Return 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'. | ||
| 209 | Find string representation for NODE and set marker, then recurse | ||
| 210 | the 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)) | 121 | Return 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'. | ||
| 132 | Find string representation for NODE and set marker, then recurse | ||
| 133 | the 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. |