diff options
| author | Yuan Fu | 2022-12-24 18:24:01 -0800 |
|---|---|---|
| committer | Yuan Fu | 2022-12-24 18:43:03 -0800 |
| commit | fbb4eb919b4c91dd8517a06934bf1f897eaa34bb (patch) | |
| tree | 9b019410546f08047252fa8d02328ad3ee566f1b /lisp/textmodes | |
| parent | 6253184afc2e53c6782a41ec1b59779449152172 (diff) | |
| download | emacs-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.el | 25 | ||||
| -rw-r--r-- | lisp/textmodes/toml-ts-mode.el | 16 |
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. | ||
| 1417 | Return 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'. |
| 1417 | Find string representation for NODE and set marker, then recurse | 1430 | Find 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 | 112 | Return 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 | |||
| 120 | the subtrees." | 120 | the 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) |