aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/textmodes
diff options
context:
space:
mode:
authorYuan Fu2022-12-24 18:24:01 -0800
committerYuan Fu2022-12-24 18:43:03 -0800
commitfbb4eb919b4c91dd8517a06934bf1f897eaa34bb (patch)
tree9b019410546f08047252fa8d02328ad3ee566f1b /lisp/textmodes
parent6253184afc2e53c6782a41ec1b59779449152172 (diff)
downloademacs-fbb4eb919b4c91dd8517a06934bf1f897eaa34bb.tar.gz
emacs-fbb4eb919b4c91dd8517a06934bf1f897eaa34bb.zip
Support treesit-defun-name in tree-sitter major modes
* lisp/progmodes/csharp-mode.el (csharp-ts-mode--defun-name): New function. (csharp-ts-mode--imenu-1): Extract into new function. (csharp-ts-mode): Setup treesit-defun-name-function. * lisp/progmodes/java-ts-mode.el (java-ts-mode--defun-name): New function. (java-ts-mode--imenu-1): Extract into new function. (java-ts-mode): Setup treesit-defun-name-function. * lisp/progmodes/js.el (js-treesit-current-defun): Remove function. This function is not used (for a while already). (js--treesit-defun-name): New function. (js--treesit-imenu-1): Extract into new function. (js-ts-mode): Setup treesit-defun-name-function. * lisp/progmodes/json-ts-mode.el (json-ts-mode--defun-name): New function. (json-ts-mode--imenu-1): Extract into new function. (json-ts-mode): Setup treesit-defun-name-function. * lisp/progmodes/python.el (python--treesit-defun-name): New function. (python--imenu-treesit-create-index-1): Extract into new function. (python-ts-mode): Setup treesit-defun-name-function. * lisp/progmodes/rust-ts-mode.el (rust-ts-mode--defun-name): New function. (rust-ts-mode--imenu-1): Extract into new function. (rust-ts-mode): Setup treesit-defun-name-function. * lisp/textmodes/css-mode.el (css--treesit-defun-name): New function. (css--treesit-imenu-1): Extract into new function. (css-ts-mode): Setup treesit-defun-name-function. * lisp/textmodes/toml-ts-mode.el (toml-ts-mode--get-table-name): Remove function. (toml-ts-mode--defun-name): New function. (toml-ts-mode--imenu-1): Extract into new function. (toml-ts-mode): Setup treesit-defun-name-function.
Diffstat (limited to 'lisp/textmodes')
-rw-r--r--lisp/textmodes/css-mode.el25
-rw-r--r--lisp/textmodes/toml-ts-mode.el16
2 files changed, 25 insertions, 16 deletions
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)