@@ -102,6 +102,12 @@ Defaults to side following treemacs default."
102
102
:type 'list
103
103
:group 'lsp-clojure )
104
104
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
+
105
111
; ; Internal
106
112
107
113
(lsp-interface
@@ -362,12 +368,14 @@ and the third the column."
362
368
nil
363
369
t ))
364
370
371
+ ; ; Test tree
372
+
365
373
(defvar-local lsp-clojure--test-tree-data nil )
366
374
(defconst lsp-clojure--test-tree-buffer-name " *Clojure Test Tree*" )
367
375
368
376
(defvar treemacs-position )
369
377
(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 ? ) )
371
379
(declare-function lsp-treemacs--open-file-in-mru " ext:lsp-treemacs" (file))
372
380
373
381
(defun lsp-clojure--test-tree-ret-action (uri range )
@@ -394,7 +402,6 @@ NODE is the node with all test children data."
394
402
:uri uri)))
395
403
(if (seq-empty-p children?)
396
404
base-tree
397
- base-tree
398
405
(plist-put base-tree :children (seq-map (-partial #'lsp-clojure--test-tree-data->tree uri) children?) ))))
399
406
400
407
(lsp-defun lsp-clojure--render-test-tree ((&clojure-lsp:TestTreeParams :uri :tree ))
@@ -441,6 +448,103 @@ It updates the test tree view data."
441
448
(lsp-clojure--show-test-tree ignore-focus?)
442
449
(error " The package lsp-treemacs is not installed " )))
443
450
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
+
444
548
(defun lsp-clojure--build-command ()
445
549
" Build clojure-lsp start command."
446
550
(let* ((base-command (or lsp-clojure-custom-server-command
0 commit comments