aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/progmodes/csharp-mode.el22
-rw-r--r--lisp/progmodes/java-ts-mode.el22
-rw-r--r--lisp/progmodes/js.el42
-rw-r--r--lisp/progmodes/json-ts-mode.el17
-rw-r--r--lisp/progmodes/python.el17
-rw-r--r--lisp/progmodes/rust-ts-mode.el55
-rw-r--r--lisp/textmodes/css-mode.el25
-rw-r--r--lisp/textmodes/toml-ts-mode.el16
8 files changed, 133 insertions, 83 deletions
diff --git a/lisp/progmodes/csharp-mode.el b/lisp/progmodes/csharp-mode.el
index 2d13ae6930c..985e2e7b0bf 100644
--- a/lisp/progmodes/csharp-mode.el
+++ b/lisp/progmodes/csharp-mode.el
@@ -837,6 +837,22 @@ compilation and evaluation time conflicts."
837;;;###autoload 837;;;###autoload
838(add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-mode)) 838(add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-mode))
839 839
840(defun csharp-ts-mode--defun-name (node)
841 "Return the defun name of NODE.
842Return nil if there is no name or if NODE is not a defun node."
843 (pcase (treesit-node-type node)
844 ((or "method_declaration"
845 "record_declaration"
846 "struct_declaration"
847 "enum_declaration"
848 "interface_declaration"
849 "class_declaration"
850 "class_declaration")
851 (treesit-node-text
852 (treesit-node-child-by-field-name
853 node "name")
854 t))))
855
840(defun csharp-ts-mode--imenu-1 (node) 856(defun csharp-ts-mode--imenu-1 (node)
841 "Helper for `csharp-ts-mode--imenu'. 857 "Helper for `csharp-ts-mode--imenu'.
842Find string representation for NODE and set marker, then recurse 858Find string representation for NODE and set marker, then recurse
@@ -844,10 +860,7 @@ the subtrees."
844 (let* ((ts-node (car node)) 860 (let* ((ts-node (car node))
845 (subtrees (mapcan #'csharp-ts-mode--imenu-1 (cdr node))) 861 (subtrees (mapcan #'csharp-ts-mode--imenu-1 (cdr node)))
846 (name (when ts-node 862 (name (when ts-node
847 (or (treesit-node-text 863 (or (treesit-defun-name ts-node)
848 (or (treesit-node-child-by-field-name
849 ts-node "name"))
850 t)
851 "Unnamed node"))) 864 "Unnamed node")))
852 (marker (when ts-node 865 (marker (when ts-node
853 (set-marker (make-marker) 866 (set-marker (make-marker)
@@ -935,6 +948,7 @@ Key bindings:
935 948
936 ;; Navigation. 949 ;; Navigation.
937 (setq-local treesit-defun-type-regexp "declaration") 950 (setq-local treesit-defun-type-regexp "declaration")
951 (setq-local treesit-defun-name-function #'csharp-ts-mode--defun-name)
938 952
939 ;; Font-lock. 953 ;; Font-lock.
940 (setq-local treesit-font-lock-settings csharp-ts-mode--font-lock-settings) 954 (setq-local treesit-font-lock-settings csharp-ts-mode--font-lock-settings)
diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el
index 9da2c254f87..3e0439ddf54 100644
--- a/lisp/progmodes/java-ts-mode.el
+++ b/lisp/progmodes/java-ts-mode.el
@@ -248,6 +248,22 @@
248 '((["," ":" ";"]) @font-lock-delimiter-face)) 248 '((["," ":" ";"]) @font-lock-delimiter-face))
249 "Tree-sitter font-lock settings for `java-ts-mode'.") 249 "Tree-sitter font-lock settings for `java-ts-mode'.")
250 250
251(defun java-ts-mode--defun-name (node)
252 "Return the defun name of NODE.
253Return nil if there is no name or if NODE is not a defun node."
254 (pcase (treesit-node-type node)
255 ((or "method_declaration"
256 "class_declaration"
257 "record_declaration"
258 "interface_declaration"
259 "enum_declaration"
260 "import_declaration"
261 "package_declaration"
262 "module_declaration")
263 (treesit-node-text
264 (treesit-node-child-by-field-name node "name")
265 t))))
266
251(defun java-ts-mode--imenu-1 (node) 267(defun java-ts-mode--imenu-1 (node)
252 "Helper for `java-ts-mode--imenu'. 268 "Helper for `java-ts-mode--imenu'.
253Find string representation for NODE and set marker, then recurse 269Find string representation for NODE and set marker, then recurse
@@ -255,10 +271,7 @@ the subtrees."
255 (let* ((ts-node (car node)) 271 (let* ((ts-node (car node))
256 (subtrees (mapcan #'java-ts-mode--imenu-1 (cdr node))) 272 (subtrees (mapcan #'java-ts-mode--imenu-1 (cdr node)))
257 (name (when ts-node 273 (name (when ts-node
258 (or (treesit-node-text 274 (or (treesit-defun-name ts-node)
259 (or (treesit-node-child-by-field-name
260 ts-node "name"))
261 t)
262 "Unnamed node"))) 275 "Unnamed node")))
263 (marker (when ts-node 276 (marker (when ts-node
264 (set-marker (make-marker) 277 (set-marker (make-marker)
@@ -334,6 +347,7 @@ the subtrees."
334 "import_declaration" 347 "import_declaration"
335 "package_declaration" 348 "package_declaration"
336 "module_declaration"))) 349 "module_declaration")))
350 (setq-local treesit-defun-name-function #'java-ts-mode--defun-name)
337 351
338 ;; Font-lock. 352 ;; Font-lock.
339 (setq-local treesit-font-lock-settings java-ts-mode--font-lock-settings) 353 (setq-local treesit-font-lock-settings java-ts-mode--font-lock-settings)
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 1b34c0de418..14feed221fb 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3656,24 +3656,18 @@ OVERRIDE is the override flag described in
3656 (setq font-beg (treesit-node-end child) 3656 (setq font-beg (treesit-node-end child)
3657 child (treesit-node-next-sibling child))))) 3657 child (treesit-node-next-sibling child)))))
3658 3658
3659(defun js-treesit-current-defun () 3659(defun js--treesit-defun-name (node)
3660 "Return name of surrounding function. 3660 "Return the defun name of NODE.
3661This function can be used as a value in `which-func-functions'" 3661Return nil if there is no name or if NODE is not a defun node."
3662 (let ((node (treesit-node-at (point))) 3662 (treesit-node-text
3663 (name-list ())) 3663 (treesit-node-child-by-field-name
3664 (cl-loop while node 3664 (pcase (treesit-node-type node)
3665 if (pcase (treesit-node-type node) 3665 ("lexical_declaration"
3666 ("function_declaration" t) 3666 (treesit-search-subtree node "variable_declarator" nil nil 1))
3667 ("method_definition" t) 3667 ((or "function_declaration" "method_definition" "class_declaration")
3668 ("class_declaration" t) 3668 node))
3669 ("variable_declarator" t) 3669 "name")
3670 (_ nil)) 3670 t))
3671 do (push (treesit-node-text
3672 (treesit-node-child-by-field-name node "name")
3673 t)
3674 name-list)
3675 do (setq node (treesit-node-parent node))
3676 finally return (string-join name-list "."))))
3677 3671
3678(defun js--treesit-imenu-1 (node) 3672(defun js--treesit-imenu-1 (node)
3679 "Given a sparse tree, create an imenu alist. 3673 "Given a sparse tree, create an imenu alist.
@@ -3702,15 +3696,8 @@ definition*\"."
3702 ("function_declaration" 'function))) 3696 ("function_declaration" 'function)))
3703 ;; The root of the tree could have a nil ts-node. 3697 ;; The root of the tree could have a nil ts-node.
3704 (name (when ts-node 3698 (name (when ts-node
3705 (let ((ts-node-1 3699 (or (treesit-defun-name ts-node)
3706 (if (eq type 'variable) 3700 "Anonymous")))
3707 (treesit-search-subtree
3708 ts-node "variable_declarator" nil nil 1)
3709 ts-node)))
3710 (treesit-node-text
3711 (treesit-node-child-by-field-name
3712 ts-node-1 "name")
3713 t))))
3714 (marker (when ts-node 3701 (marker (when ts-node
3715 (set-marker (make-marker) 3702 (set-marker (make-marker)
3716 (treesit-node-start ts-node))))) 3703 (treesit-node-start ts-node)))))
@@ -3885,6 +3872,7 @@ Currently there are `js-mode' and `js-ts-mode'."
3885 "method_definition" 3872 "method_definition"
3886 "function_declaration" 3873 "function_declaration"
3887 "lexical_declaration"))) 3874 "lexical_declaration")))
3875 (setq-local treesit-defun-name-function #'js--treesit-defun-name)
3888 ;; Fontification. 3876 ;; Fontification.
3889 (setq-local treesit-font-lock-settings js--treesit-font-lock-settings) 3877 (setq-local treesit-font-lock-settings js--treesit-font-lock-settings)
3890 (setq-local treesit-font-lock-feature-list 3878 (setq-local treesit-font-lock-feature-list
diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el
index 6c2f3805872..6725c5f2270 100644
--- a/lisp/progmodes/json-ts-mode.el
+++ b/lisp/progmodes/json-ts-mode.el
@@ -107,6 +107,16 @@
107 '((ERROR) @font-lock-warning-face)) 107 '((ERROR) @font-lock-warning-face))
108 "Font-lock settings for JSON.") 108 "Font-lock settings for JSON.")
109 109
110(defun json-ts-mode--defun-name (node)
111 "Return the defun name of NODE.
112Return nil if there is no name or if NODE is not a defun node."
113 (pcase (treesit-node-type node)
114 ((or "pair" "object")
115 (treesit-node-text
116 (treesit-node-child-by-field-name
117 node "key")
118 t))))
119
110(defun json-ts-mode--imenu-1 (node) 120(defun json-ts-mode--imenu-1 (node)
111 "Helper for `json-ts-mode--imenu'. 121 "Helper for `json-ts-mode--imenu'.
112Find string representation for NODE and set marker, then recurse 122Find string representation for NODE and set marker, then recurse
@@ -114,10 +124,8 @@ the subtrees."
114 (let* ((ts-node (car node)) 124 (let* ((ts-node (car node))
115 (subtrees (mapcan #'json-ts-mode--imenu-1 (cdr node))) 125 (subtrees (mapcan #'json-ts-mode--imenu-1 (cdr node)))
116 (name (when ts-node 126 (name (when ts-node
117 (treesit-node-text 127 (or (treesit-defun-name ts-node)
118 (treesit-node-child-by-field-name 128 "Anonymous")))
119 ts-node "key")
120 t)))
121 (marker (when ts-node 129 (marker (when ts-node
122 (set-marker (make-marker) 130 (set-marker (make-marker)
123 (treesit-node-start ts-node))))) 131 (treesit-node-start ts-node)))))
@@ -161,6 +169,7 @@ the subtrees."
161 ;; Navigation. 169 ;; Navigation.
162 (setq-local treesit-defun-type-regexp 170 (setq-local treesit-defun-type-regexp
163 (rx (or "pair" "object"))) 171 (rx (or "pair" "object")))
172 (setq-local treesit-defun-name-function #'json-ts-mode--defun-name)
164 173
165 ;; Font-lock. 174 ;; Font-lock.
166 (setq-local treesit-font-lock-settings json-ts-mode--font-lock-settings) 175 (setq-local treesit-font-lock-settings json-ts-mode--font-lock-settings)
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index bdc9e6fa78c..d383fa57c04 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -5448,6 +5448,16 @@ To this:
5448 5448
5449;;; Tree-sitter imenu 5449;;; Tree-sitter imenu
5450 5450
5451(defun python--treesit-defun-name (node)
5452 "Return the defun name of NODE.
5453Return nil if there is no name or if NODE is not a defun node."
5454 (pcase (treesit-node-type node)
5455 ((or "function_definition" "class_definition")
5456 (treesit-node-text
5457 (treesit-node-child-by-field-name
5458 node "name")
5459 t))))
5460
5451(defun python--imenu-treesit-create-index-1 (node) 5461(defun python--imenu-treesit-create-index-1 (node)
5452 "Given a sparse tree, create an imenu alist. 5462 "Given a sparse tree, create an imenu alist.
5453 5463
@@ -5473,9 +5483,8 @@ definition*\"."
5473 ("class_definition" 'class))) 5483 ("class_definition" 'class)))
5474 ;; The root of the tree could have a nil ts-node. 5484 ;; The root of the tree could have a nil ts-node.
5475 (name (when ts-node 5485 (name (when ts-node
5476 (treesit-node-text 5486 (or (treesit-defun-name ts-node)
5477 (treesit-node-child-by-field-name 5487 "Anonymous")))
5478 ts-node "name") t)))
5479 (marker (when ts-node 5488 (marker (when ts-node
5480 (set-marker (make-marker) 5489 (set-marker (make-marker)
5481 (treesit-node-start ts-node))))) 5490 (treesit-node-start ts-node)))))
@@ -6643,6 +6652,8 @@ implementations: `python-mode' and `python-ts-mode'."
6643 #'python-imenu-treesit-create-index) 6652 #'python-imenu-treesit-create-index)
6644 (setq-local treesit-defun-type-regexp (rx (or "function" "class") 6653 (setq-local treesit-defun-type-regexp (rx (or "function" "class")
6645 "_definition")) 6654 "_definition"))
6655 (setq-local treesit-defun-name-function
6656 #'python--treesit-defun-name)
6646 (treesit-major-mode-setup) 6657 (treesit-major-mode-setup)
6647 6658
6648 (when python-indent-guess-indent-offset 6659 (when python-indent-guess-indent-offset
diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el
index 8b2ed191019..81f5b8765f1 100644
--- a/lisp/progmodes/rust-ts-mode.el
+++ b/lisp/progmodes/rust-ts-mode.el
@@ -273,6 +273,33 @@
273 (when struct-index `(("Struct" . ,struct-index))) 273 (when struct-index `(("Struct" . ,struct-index)))
274 (when func-index `(("Fn" . ,func-index)))))) 274 (when func-index `(("Fn" . ,func-index))))))
275 275
276(defun rust-ts-mode--defun-name (node)
277 "Return the defun name of NODE.
278Return nil if there is no name or if NODE is not a defun node."
279 (pcase (treesit-node-type node)
280 ("enum_item"
281 (treesit-node-text
282 (treesit-node-child-by-field-name node "name") t))
283 ("function_item"
284 (treesit-node-text
285 (treesit-node-child-by-field-name node "name") t))
286 ("impl_item"
287 (let ((trait-node (treesit-node-child-by-field-name node "trait")))
288 (concat
289 (treesit-node-text trait-node t)
290 (when trait-node " for ")
291 (treesit-node-text
292 (treesit-node-child-by-field-name node "type") t))))
293 ("mod_item"
294 (treesit-node-text
295 (treesit-node-child-by-field-name node "name") t))
296 ("struct_item"
297 (treesit-node-text
298 (treesit-node-child-by-field-name node "name") t))
299 ("type_item"
300 (treesit-node-text
301 (treesit-node-child-by-field-name node "name") t))))
302
276(defun rust-ts-mode--imenu-1 (node) 303(defun rust-ts-mode--imenu-1 (node)
277 "Helper for `rust-ts-mode--imenu'. 304 "Helper for `rust-ts-mode--imenu'.
278Find string representation for NODE and set marker, then recurse 305Find string representation for NODE and set marker, then recurse
@@ -282,31 +309,8 @@ the subtrees."
282 (subtrees (mapcan #'rust-ts-mode--imenu-1 309 (subtrees (mapcan #'rust-ts-mode--imenu-1
283 children)) 310 children))
284 (name (when ts-node 311 (name (when ts-node
285 (pcase (treesit-node-type ts-node) 312 (or (treesit-defun-name ts-node)
286 ("enum_item" 313 "Anonymous")))
287 (treesit-node-text
288 (treesit-node-child-by-field-name ts-node "name") t))
289 ("function_item"
290 (treesit-node-text
291 (treesit-node-child-by-field-name ts-node "name") t))
292 ("impl_item"
293 (let ((trait-node (treesit-node-child-by-field-name ts-node "trait")))
294 (concat
295 (treesit-node-text
296 trait-node t)
297 (when trait-node
298 " for ")
299 (treesit-node-text
300 (treesit-node-child-by-field-name ts-node "type") t))))
301 ("mod_item"
302 (treesit-node-text
303 (treesit-node-child-by-field-name ts-node "name") t))
304 ("struct_item"
305 (treesit-node-text
306 (treesit-node-child-by-field-name ts-node "name") t))
307 ("type_item"
308 (treesit-node-text
309 (treesit-node-child-by-field-name ts-node "name") t)))))
310 (marker (when ts-node 314 (marker (when ts-node
311 (set-marker (make-marker) 315 (set-marker (make-marker)
312 (treesit-node-start ts-node))))) 316 (treesit-node-start ts-node)))))
@@ -363,6 +367,7 @@ the subtrees."
363 "function_item" 367 "function_item"
364 "impl_item" 368 "impl_item"
365 "struct_item"))) 369 "struct_item")))
370 (setq-local treesit-defun-name-function #'rust-ts-mode--defun-name)
366 371
367 (treesit-major-mode-setup))) 372 (treesit-major-mode-setup)))
368 373
diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el
index 822097a86d8..99ef4f10a06 100644
--- a/lisp/textmodes/css-mode.el
+++ b/lisp/textmodes/css-mode.el
@@ -1412,6 +1412,19 @@ for determining whether point is within a selector."
1412 '((ERROR) @error)) 1412 '((ERROR) @error))
1413 "Tree-sitter font-lock settings for `css-ts-mode'.") 1413 "Tree-sitter font-lock settings for `css-ts-mode'.")
1414 1414
1415(defun css--treesit-defun-name (node)
1416 "Return the defun name of NODE.
1417Return nil if there is no name or if NODE is not a defun node."
1418 (pcase (treesit-node-type node)
1419 ("rule_set" (treesit-node-text
1420 (treesit-node-child node 0) t))
1421 ("media_statement"
1422 (let ((block (treesit-node-child node -1)))
1423 (string-trim
1424 (buffer-substring-no-properties
1425 (treesit-node-start node)
1426 (treesit-node-start block)))))))
1427
1415(defun css--treesit-imenu-1 (node) 1428(defun css--treesit-imenu-1 (node)
1416 "Helper for `css--treesit-imenu'. 1429 "Helper for `css--treesit-imenu'.
1417Find string representation for NODE and set marker, then recurse 1430Find string representation for NODE and set marker, then recurse
@@ -1419,15 +1432,8 @@ the subtrees."
1419 (let* ((ts-node (car node)) 1432 (let* ((ts-node (car node))
1420 (subtrees (mapcan #'css--treesit-imenu-1 (cdr node))) 1433 (subtrees (mapcan #'css--treesit-imenu-1 (cdr node)))
1421 (name (when ts-node 1434 (name (when ts-node
1422 (pcase (treesit-node-type ts-node) 1435 (or (treesit-defun-name ts-node)
1423 ("rule_set" (treesit-node-text 1436 "Anonymous")))
1424 (treesit-node-child ts-node 0) t))
1425 ("media_statement"
1426 (let ((block (treesit-node-child ts-node -1)))
1427 (string-trim
1428 (buffer-substring-no-properties
1429 (treesit-node-start ts-node)
1430 (treesit-node-start block))))))))
1431 (marker (when ts-node 1437 (marker (when ts-node
1432 (set-marker (make-marker) 1438 (set-marker (make-marker)
1433 (treesit-node-start ts-node))))) 1439 (treesit-node-start ts-node)))))
@@ -1835,6 +1841,7 @@ can also be used to fill comments.
1835 (treesit-parser-create 'css) 1841 (treesit-parser-create 'css)
1836 (setq-local treesit-simple-indent-rules css--treesit-indent-rules) 1842 (setq-local treesit-simple-indent-rules css--treesit-indent-rules)
1837 (setq-local treesit-defun-type-regexp "rule_set") 1843 (setq-local treesit-defun-type-regexp "rule_set")
1844 (setq-local treesit-defun-name-function #'css--treesit-defun-name)
1838 (setq-local treesit-font-lock-settings css--treesit-settings) 1845 (setq-local treesit-font-lock-settings css--treesit-settings)
1839 (setq-local treesit-font-lock-feature-list 1846 (setq-local treesit-font-lock-feature-list
1840 '((selector comment query keyword) 1847 '((selector comment query keyword)
diff --git a/lisp/textmodes/toml-ts-mode.el b/lisp/textmodes/toml-ts-mode.el
index bca6a5e81ad..790de2133e8 100644
--- a/lisp/textmodes/toml-ts-mode.el
+++ b/lisp/textmodes/toml-ts-mode.el
@@ -107,12 +107,12 @@
107 '((ERROR) @font-lock-warning-face)) 107 '((ERROR) @font-lock-warning-face))
108 "Font-lock settings for TOML.") 108 "Font-lock settings for TOML.")
109 109
110(defun toml-ts-mode--get-table-name (node) 110(defun toml-ts-mode--defun-name (node)
111 "Obtains the header-name for the associated tree-sitter `NODE'." 111 "Return the defun name of NODE.
112 (if node 112Return nil if there is no name or if NODE is not a defun node."
113 (treesit-node-text 113 (pcase (treesit-node-type node)
114 (car (cdr (treesit-node-children node)))) 114 ((or "table" "table_array_element")
115 "Root table")) 115 (car (cdr (treesit-node-children node))))))
116 116
117(defun toml-ts-mode--imenu-1 (node) 117(defun toml-ts-mode--imenu-1 (node)
118 "Helper for `toml-ts-mode--imenu'. 118 "Helper for `toml-ts-mode--imenu'.
@@ -120,7 +120,8 @@ Find string representation for NODE and set marker, then recurse
120the subtrees." 120the subtrees."
121 (let* ((ts-node (car node)) 121 (let* ((ts-node (car node))
122 (subtrees (mapcan #'toml-ts-mode--imenu-1 (cdr node))) 122 (subtrees (mapcan #'toml-ts-mode--imenu-1 (cdr node)))
123 (name (toml-ts-mode--get-table-name ts-node)) 123 (name (or (treesit-defun-name ts-node)
124 "Root table"))
124 (marker (when ts-node 125 (marker (when ts-node
125 (set-marker (make-marker) 126 (set-marker (make-marker)
126 (treesit-node-start ts-node))))) 127 (treesit-node-start ts-node)))))
@@ -167,6 +168,7 @@ the subtrees."
167 ;; Navigation. 168 ;; Navigation.
168 (setq-local treesit-defun-type-regexp 169 (setq-local treesit-defun-type-regexp
169 (rx (or "table" "table_array_element"))) 170 (rx (or "table" "table_array_element")))
171 (setq-local treesit-defun-name-function #'toml-ts-mode--defun-name)
170 172
171 ;; Font-lock. 173 ;; Font-lock.
172 (setq-local treesit-font-lock-settings toml-ts-mode--font-lock-settings) 174 (setq-local treesit-font-lock-settings toml-ts-mode--font-lock-settings)