Skip to content

Commit 2da66b3

Browse files
committed
clojure: add support for clojure/workspace/projectTree/nodes
1 parent 520882c commit 2da66b3

File tree

2 files changed

+108
-3
lines changed

2 files changed

+108
-3
lines changed

clients/lsp-clojure.el

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ Defaults to side following treemacs default."
102102
:type 'list
103103
:group 'lsp-clojure)
104104

105+
(defcustom lsp-clojure-project-tree-position-params nil
106+
"The optional project tree position params.
107+
Defaults to side following treemacs default."
108+
:type 'list
109+
:group 'lsp-clojure)
110+
105111
;; Internal
106112

107113
(lsp-interface
@@ -362,12 +368,14 @@ and the third the column."
362368
nil
363369
t))
364370

371+
;; Test tree
372+
365373
(defvar-local lsp-clojure--test-tree-data nil)
366374
(defconst lsp-clojure--test-tree-buffer-name "*Clojure Test Tree*")
367375

368376
(defvar treemacs-position)
369377
(defvar treemacs-width)
370-
(declare-function lsp-treemacs-render "ext:lsp-treemacs" (tree title expand-depth &optional buffer-name))
378+
(declare-function lsp-treemacs-render "ext:lsp-treemacs" (tree title expand-depth &optional buffer-name right-click-actions clear-cache?))
371379
(declare-function lsp-treemacs--open-file-in-mru "ext:lsp-treemacs" (file))
372380

373381
(defun lsp-clojure--test-tree-ret-action (uri range)
@@ -394,7 +402,6 @@ NODE is the node with all test children data."
394402
:uri uri)))
395403
(if (seq-empty-p children?)
396404
base-tree
397-
base-tree
398405
(plist-put base-tree :children (seq-map (-partial #'lsp-clojure--test-tree-data->tree uri) children?)))))
399406

400407
(lsp-defun lsp-clojure--render-test-tree ((&clojure-lsp:TestTreeParams :uri :tree))
@@ -441,6 +448,103 @@ It updates the test tree view data."
441448
(lsp-clojure--show-test-tree ignore-focus?)
442449
(error "The package lsp-treemacs is not installed")))
443450

451+
;; Project Tree
452+
453+
(defconst lsp-clojure--project-tree-buffer-name "*Clojure Project Tree*")
454+
455+
(defun lsp-clojure--project-tree-type->icon (type)
456+
"Convert the project tree type TYPE to icon."
457+
(cl-case type
458+
(1 'project)
459+
(2 'folder)
460+
(3 'library)
461+
(4 'jar)
462+
(5 'namespace)
463+
(6 'class)))
464+
465+
(defun lsp-clojure--project-tree-ret-action (uri)
466+
"Build the ret action for an item in the project tree view.
467+
URI is the source of the item."
468+
(interactive)
469+
(lsp-treemacs--open-file-in-mru (lsp--uri-to-path uri))
470+
(run-hooks 'xref-after-jump-hook))
471+
472+
(lsp-defun lsp-clojure--project-tree-children-data->tree (buffer current-node &optional _ callback)
473+
"Builds a project tree considering CURRENT-NODE."
474+
(with-current-buffer buffer
475+
(lsp-request-async
476+
"clojure/workspace/projectTree/nodes"
477+
current-node
478+
(-lambda ((&clojure-lsp:ProjectTreeNode :nodes?))
479+
(funcall
480+
callback
481+
(-map
482+
(-lambda ((node &as &clojure-lsp:ProjectTreeNode :id? :name :type :uri? :detail? :final?))
483+
(-let ((label (if detail?
484+
(format "%s %s" name (propertize detail? 'face 'lsp-details-face))
485+
name)))
486+
`(:label ,label
487+
:key ,(or id? name)
488+
:icon ,(lsp-clojure--project-tree-type->icon type)
489+
,@(unless final?
490+
(list :children-async (-partial #'lsp-clojure--project-tree-children-data->tree buffer node)))
491+
,@(when uri?
492+
(list :uri uri?
493+
:ret-action (lambda (&rest _)
494+
(interactive)
495+
(lsp-clojure--project-tree-ret-action uri?)))))))
496+
nodes?)))
497+
:mode 'detached)))
498+
499+
(defun lsp-clojure--project-tree-data->tree ()
500+
"Builds a project tree considering CURRENT-NODE."
501+
(-let* (((&clojure-lsp:ProjectTreeNode :id? :name :nodes? :uri?) (lsp-request "clojure/workspace/projectTree/nodes" nil))
502+
(buffer (current-buffer)))
503+
(list :key (or id? name)
504+
:label name
505+
:icon "clj"
506+
:children (seq-map (-lambda ((node &as &clojure-lsp:ProjectTreeNode :id? :name :type :uri?))
507+
(list :key (or id? name)
508+
:label name
509+
:icon (lsp-clojure--project-tree-type->icon type)
510+
:children-async (-partial #'lsp-clojure--project-tree-children-data->tree buffer node)
511+
:uri uri?))
512+
nodes?)
513+
:uri uri?)))
514+
515+
(defun lsp-clojure--render-project-tree ()
516+
"Render a project tree view."
517+
(save-excursion
518+
(lsp-treemacs-render
519+
(list (lsp-clojure--project-tree-data->tree))
520+
"Clojure Project Tree"
521+
nil
522+
lsp-clojure--project-tree-buffer-name
523+
nil
524+
t)))
525+
526+
(defun lsp-clojure--show-project-tree (ignore-focus?)
527+
"Show a project tree for current project.
528+
Focus on it if IGNORE-FOCUS? is nil."
529+
(-let* ((tree-buffer (lsp-clojure--render-project-tree))
530+
(position-params (or lsp-clojure-project-tree-position-params
531+
`((side . ,treemacs-position)
532+
(slot . 2)
533+
(window-width . ,treemacs-width))))
534+
(window (display-buffer-in-side-window tree-buffer position-params)))
535+
(unless ignore-focus?
536+
(select-window window)
537+
(set-window-dedicated-p window t))))
538+
539+
;;;###autoload
540+
(defun lsp-clojure-show-project-tree (ignore-focus?)
541+
"Show a project tree with source-paths and dependencies.
542+
Focus on it if IGNORE-FOCUS? is nil."
543+
(interactive "P")
544+
(if (require 'lsp-treemacs nil t)
545+
(lsp-clojure--show-project-tree ignore-focus?)
546+
(error "The package lsp-treemacs is not installed")))
547+
444548
(defun lsp-clojure--build-command ()
445549
"Build clojure-lsp start command."
446550
(let* ((base-command (or lsp-clojure-custom-server-command

lsp-protocol.el

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,8 @@ See `-let' for a description of the destructuring mechanism."
428428
(rust-analyzer:CommandLinkGroup (:commands) (:title)))
429429

430430
(lsp-interface (clojure-lsp:TestTreeParams (:uri :tree) nil)
431-
(clojure-lsp:TestTreeNode (:name :range :nameRange :kind) (:children)))
431+
(clojure-lsp:TestTreeNode (:name :range :nameRange :kind) (:children))
432+
(clojure-lsp:ProjectTreeNode (:name :type) (:nodes :final :id :uri :detail)))
432433

433434
(lsp-interface (terraform-ls:ModuleCalls (:v :module_calls) nil))
434435
(lsp-interface (terraform-ls:Module (:name :docs_link :version :source_type :dependent_modules) nil))

0 commit comments

Comments
 (0)