summaryrefslogtreecommitdiff
path: root/lisp/progmodes/js.el
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2022-11-12 15:57:02 -0800
committerYuan Fu <casouri@gmail.com>2022-11-12 15:57:02 -0800
commit908aab6144bf9f62dd5b2c2f1776ed177fa6d18f (patch)
tree11d57d02c4f87e5ddf7f4c6133c2f893c221e1f8 /lisp/progmodes/js.el
parentc78dc25a5351b1a4191028ba252c892ae1dd2438 (diff)
downloademacs-908aab6144bf9f62dd5b2c2f1776ed177fa6d18f.tar.gz
emacs-908aab6144bf9f62dd5b2c2f1776ed177fa6d18f.tar.bz2
emacs-908aab6144bf9f62dd5b2c2f1776ed177fa6d18f.zip
Improve tree-sitter imenu for c-mode and js-mode
Instead of a flat list, now categorize imenu entries into categories like "Function", "Variable", "Class", etc. * lisp/progmodes/c-ts-mode.el (c-ts-mode--imenu-1): Handle more edge cases. (c-ts-mode--imenu): Categorize menu entries. * lisp/progmodes/js.el (js--treesit-imenu-type-alist): Remove variable. (js--treesit-imenu-label): Remove function. (js--treesit-imenu-1): Use the name alone for labels. (js--treesit-imenu): Categorize menu entries.
Diffstat (limited to 'lisp/progmodes/js.el')
-rw-r--r--lisp/progmodes/js.el44
1 files changed, 14 insertions, 30 deletions
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 8ec7e7c6750..ac2b6a27b7e 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3631,23 +3631,6 @@ This function can be used as a value in `which-func-functions'"
do (setq node (treesit-node-parent node))
finally return (string-join name-list "."))))
-;; Keep this private since we might later change it or generalize it.
-(defvar js--treesit-imenu-type-alist
- '((variable . "V ")
- (function . "F ")
- (class . "C ")
- (method . "M "))
- "Maps imenu label types to their \"symbol\".
-Symbols are prefixed to each label in imenu (see
-`js--treesit-imenu-label').")
-
-(defun js--treesit-imenu-label (type name)
- "Format label for imenu.
-TYPE can be `variable', `function', `class', `method'.
-NAME is a string."
- (format "%s%s" (alist-get type js--treesit-imenu-type-alist)
- name))
-
(defun js--treesit-imenu-1 (node)
"Given a sparse tree, create an imenu alist.
@@ -3695,23 +3678,24 @@ definition*\"."
(treesit-node-top-level ts-node))
nil)
(subtrees
- (let ((parent-label (js--treesit-imenu-label type name))
- (jump-label ""))
- `((,parent-label
- ,(cons jump-label marker)
- ,@subtrees))))
- (t (let ((label (js--treesit-imenu-label type name)))
- (list (cons label marker)))))))
+ `((,name
+ ,(cons "" marker)
+ ,@subtrees)))
+ (t (list (cons name marker))))))
(defun js--treesit-imenu ()
"Return Imenu alist for the current buffer."
(let* ((node (treesit-buffer-root-node))
- (tree (treesit-induce-sparse-tree
- node (rx (or "class_declaration"
- "method_definition"
- "function_declaration"
- "lexical_declaration")))))
- (js--treesit-imenu-1 tree)))
+ (class-tree (treesit-induce-sparse-tree
+ node (rx (or "class_declaration"
+ "method_definition"))))
+ (func-tree (treesit-induce-sparse-tree
+ node "function_declaration"))
+ (var-tree (treesit-induce-sparse-tree
+ node "lexical_declaration")))
+ `(("Class" . ,(js--treesit-imenu-1 class-tree))
+ ("Varieable" . ,(js--treesit-imenu-1 var-tree))
+ ("Function" . ,(js--treesit-imenu-1 func-tree)))))
;;; Main Function