|  | 
| 659 | 659 | 
 | 
| 660 | 660 | (defun lsp-treemacs-deps--get-children (dep) | 
| 661 | 661 |   (lsp-treemacs-deps-with-jdtls | 
| 662 |  | -    (-let* (((&hash "projectUri" project-uri "rootPath" root-path "path" "kind" "name" "uri") dep) | 
| 663 |  | -            (project-uri (if (eq kind 2) uri project-uri))) | 
| 664 |  | -      (unless (or (= kind 6) | 
| 665 |  | -                  (= kind 8)) | 
| 666 |  | -        (->> (lsp-send-execute-command | 
| 667 |  | -              "java.getPackageData" | 
| 668 |  | -              (vector (ht ("kind" kind) | 
| 669 |  | -                          ("path" (unless (eq kind 2) | 
| 670 |  | -                                    (if (= 5 kind) | 
| 671 |  | -                                        name | 
| 672 |  | -                                      path))) | 
| 673 |  | -                          ("rootPath" (unless (eq kind 2) | 
| 674 |  | -                                        (or root-path path))) | 
| 675 |  | -                          ("projectUri" project-uri)))) | 
| 676 |  | -             (-mapcat (lambda (inner-dep) | 
| 677 |  | -                        (puthash "projectUri" project-uri inner-dep) | 
| 678 |  | -                        (when (= kind 4) | 
| 679 |  | -                          (puthash "rootPath" path inner-dep)) | 
| 680 |  | -                        (if (eq (gethash "entryKind" inner-dep) 3) | 
| 681 |  | -                            (lsp-treemacs-deps--get-children inner-dep) | 
| 682 |  | -                          (list inner-dep))))))))) | 
|  | 662 | +   (-let* (((&hash "projectUri" project-uri "rootPath" root-path "path" "kind" "name" "uri") dep) | 
|  | 663 | +           (project-uri (if (eq kind 2) uri project-uri))) | 
|  | 664 | +     (unless (or (= kind 6) | 
|  | 665 | +                 (= kind 8)) | 
|  | 666 | +       (->> (lsp-send-execute-command | 
|  | 667 | +             "java.getPackageData" | 
|  | 668 | +             (vector (ht ("kind" kind) | 
|  | 669 | +                         ("path" (unless (eq kind 2) | 
|  | 670 | +                                   (if (= 5 kind) | 
|  | 671 | +                                       name | 
|  | 672 | +                                     path))) | 
|  | 673 | +                         ("rootPath" (unless (eq kind 2) | 
|  | 674 | +                                       (or root-path path))) | 
|  | 675 | +                         ("projectUri" project-uri)))) | 
|  | 676 | +            (-mapcat (lambda (inner-dep) | 
|  | 677 | +                       (puthash "projectUri" project-uri inner-dep) | 
|  | 678 | +                       (when (= kind 4) | 
|  | 679 | +                         (puthash "rootPath" path inner-dep)) | 
|  | 680 | +                       (if (eq (gethash "entryKind" inner-dep) 3) | 
|  | 681 | +                           (lsp-treemacs-deps--get-children inner-dep) | 
|  | 682 | +                         (list inner-dep))))))))) | 
| 683 | 683 | 
 | 
| 684 | 684 | (defun lsp-treemacs-deps--java-file? (dep) | 
| 685 | 685 |   (-let [(&hash "kind" "entryKind" entry-kind) dep] | 
|  | 
| 693 | 693 |   :query-function (-let (((dep &as &hash "uri") (treemacs-button-get node :dep))) | 
| 694 | 694 |                     (if (lsp-treemacs-deps--java-file? dep) | 
| 695 | 695 |                         (lsp-treemacs-deps-with-jdtls | 
| 696 |  | -                          (lsp-request "textDocument/documentSymbol" | 
| 697 |  | -                                       `(:textDocument (:uri ,uri)))) | 
|  | 696 | +                         (lsp-request "textDocument/documentSymbol" | 
|  | 697 | +                                      `(:textDocument (:uri ,uri)))) | 
| 698 | 698 |                       (lsp-treemacs-deps--get-children dep))) | 
| 699 | 699 |   :ret-action 'lsp-treemacs-deps--goto-element | 
| 700 | 700 |   :render-action (if (lsp-treemacs-deps--java-file? (treemacs-button-get node :dep)) | 
|  | 
| 717 | 717 | 
 | 
| 718 | 718 | (defun lsp-treemacs-deps--root-folders () | 
| 719 | 719 |   (lsp-treemacs-deps-with-jdtls | 
| 720 |  | -    (-mapcat (lambda (root-path) | 
| 721 |  | -               (let ((project-uri (lsp--path-to-uri root-path))) | 
| 722 |  | -                 (->> project-uri | 
| 723 |  | -                      (lsp-send-execute-command "java.project.list") | 
| 724 |  | -                      (--map (--doto it (puthash "projectUri" project-uri it)))))) | 
| 725 |  | -             (lsp-session-folders (lsp-session))))) | 
|  | 720 | +   (-mapcat (lambda (root-path) | 
|  | 721 | +              (let ((project-uri (lsp--path-to-uri root-path))) | 
|  | 722 | +                (->> project-uri | 
|  | 723 | +                     (lsp-send-execute-command "java.project.list") | 
|  | 724 | +                     (--map (--doto it (puthash "projectUri" project-uri it)))))) | 
|  | 725 | +            (lsp-session-folders (lsp-session))))) | 
| 726 | 726 | 
 | 
| 727 | 727 | (treemacs-define-variadic-node lsp-treemacs-deps-list | 
| 728 | 728 |   :query-function (lsp-treemacs-deps--root-folders) | 
|  | 
| 793 | 793 | (defun lsp-treemacs-java-deps-follow () | 
| 794 | 794 |   (interactive) | 
| 795 | 795 |   (lsp-treemacs-deps-with-jdtls | 
| 796 |  | -    (let ((paths (lsp-send-execute-command "java.resolvePath" | 
| 797 |  | -                                           (lsp--buffer-uri)))) | 
| 798 |  | -      (select-window | 
| 799 |  | -       (with-current-buffer lsp-treemacs-deps-buffer-name | 
| 800 |  | -         (set-window-point | 
| 801 |  | -          (get-buffer-window) | 
| 802 |  | -          (marker-position | 
| 803 |  | -           (-reduce-from | 
| 804 |  | -            (-lambda (node (&hash "path" "name" "uri")) | 
| 805 |  | -              (unless (treemacs-is-node-expanded? node) | 
| 806 |  | -                (save-excursion | 
| 807 |  | -                  (goto-char (marker-position node)) | 
| 808 |  | -                  (funcall (alist-get (treemacs-button-get node :state) treemacs-TAB-actions-config)))) | 
| 809 |  | -              (or (lsp-treemacs--deps-find-children-for-key node (list name uri path)) | 
| 810 |  | -                  (user-error "Unable to find %s in the dependency tree." (buffer-name)))) | 
| 811 |  | -            (treemacs-dom-node->position (treemacs-find-in-dom '(:custom LSP-Java-Dependency))) | 
| 812 |  | -            paths))) | 
| 813 |  | -         (get-buffer-window))) | 
| 814 |  | -      (recenter nil)))) | 
|  | 796 | +   (let ((paths (lsp-send-execute-command "java.resolvePath" | 
|  | 797 | +                                          (lsp--buffer-uri)))) | 
|  | 798 | +     (select-window | 
|  | 799 | +      (with-current-buffer lsp-treemacs-deps-buffer-name | 
|  | 800 | +        (set-window-point | 
|  | 801 | +         (get-buffer-window) | 
|  | 802 | +         (marker-position | 
|  | 803 | +          (-reduce-from | 
|  | 804 | +           (-lambda (node (&hash "path" "name" "uri")) | 
|  | 805 | +             (unless (treemacs-is-node-expanded? node) | 
|  | 806 | +               (save-excursion | 
|  | 807 | +                 (goto-char (marker-position node)) | 
|  | 808 | +                 (funcall (alist-get (treemacs-button-get node :state) treemacs-TAB-actions-config)))) | 
|  | 809 | +             (or (lsp-treemacs--deps-find-children-for-key node (list name uri path)) | 
|  | 810 | +                 (user-error "Unable to find %s in the dependency tree." (buffer-name)))) | 
|  | 811 | +           (treemacs-dom-node->position (treemacs-find-in-dom '(:custom LSP-Java-Dependency))) | 
|  | 812 | +           paths))) | 
|  | 813 | +        (get-buffer-window))) | 
|  | 814 | +     (recenter nil)))) | 
|  | 815 | + | 
|  | 816 | + | 
|  | 817 | +;; treemacs synchronization | 
|  | 818 | + | 
|  | 819 | +(defun lsp-treemacs--on-folder-remove (project) | 
|  | 820 | +  (lsp-workspace-folders-remove (treemacs-project->path project))) | 
|  | 821 | + | 
|  | 822 | +(defun lsp-treemacs--on-folder-added (project) | 
|  | 823 | +  (lsp-workspace-folders-add (treemacs-project->path project))) | 
|  | 824 | + | 
|  | 825 | +(defun lsp-treemacs--treemacs->lsp () | 
|  | 826 | +  (let ((lsp-folders (lsp-session-folders (lsp-session))) | 
|  | 827 | +        (treemacs-folders (->> (treemacs-current-workspace) | 
|  | 828 | +                               (treemacs-workspace->projects) | 
|  | 829 | +                               (-map #'treemacs-project->path) | 
|  | 830 | +                               (-map #'lsp-cannonical-file-name)))) | 
|  | 831 | +    (seq-do #'lsp-workspace-folders-remove (-difference lsp-folders treemacs-folders)) | 
|  | 832 | +    (seq-do #'lsp-workspace-folders-add (-difference treemacs-folders lsp-folders)))) | 
|  | 833 | + | 
|  | 834 | +(defun lsp-treemacs--sync-folders (added removed) | 
|  | 835 | +  (let ((treemacs-create-project-functions (remove #'lsp-treemacs--on-folder-added | 
|  | 836 | +                                                   treemacs-create-project-functions)) | 
|  | 837 | +        (treemacs-delete-project-functions (remove #'lsp-treemacs--on-folder-remove | 
|  | 838 | +                                                   treemacs-delete-project-functions))) | 
|  | 839 | +    (seq-do (lambda (folder) | 
|  | 840 | +              (when (->> (treemacs-current-workspace) | 
|  | 841 | +                         (treemacs-workspace->projects) | 
|  | 842 | +                         (-none? (lambda (project) | 
|  | 843 | +                                   (f-same? (treemacs-project->path project) | 
|  | 844 | +                                            folder)))) | 
|  | 845 | +                (treemacs-add-project-to-workspace folder))) | 
|  | 846 | +            added) | 
|  | 847 | +    (seq-do (lambda (folder) | 
|  | 848 | +              (when-let (project (->> (treemacs-current-workspace) | 
|  | 849 | +                                      (treemacs-workspace->projects) | 
|  | 850 | +                                      (-first (lambda (project) | 
|  | 851 | +                                                (f-same? (treemacs-project->path project) | 
|  | 852 | +                                                         folder))))) | 
|  | 853 | +                (treemacs-do-remove-project-from-workspace project))) | 
|  | 854 | +            removed))) | 
|  | 855 | + | 
|  | 856 | +;;;###autoload | 
|  | 857 | +(define-minor-mode lsp-treemacs-sync-mode | 
|  | 858 | +  "Global minor mode for synchronizing lsp-mode workspace folders and treemacs projects." | 
|  | 859 | +  :init-value nil | 
|  | 860 | +  :group 'lsp-treemacs | 
|  | 861 | +  :global t | 
|  | 862 | +  :require 'lsp-treemacs | 
|  | 863 | +  (cond | 
|  | 864 | +   (lsp-treemacs-sync-mode | 
|  | 865 | +    (add-hook 'treemacs-create-project-functions #'lsp-treemacs--on-folder-added) | 
|  | 866 | +    (add-hook 'treemacs-delete-project-functions #'lsp-treemacs--on-folder-remove) | 
|  | 867 | +    (add-hook 'lsp-workspace-folders-changed-hook #'lsp-treemacs--sync-folders) | 
|  | 868 | +    (add-hook 'treemacs-workspace-edit-hook #'lsp-treemacs--treemacs->lsp) | 
|  | 869 | +    (add-hook 'treemacs-switch-workspace-hook #'lsp-treemacs--treemacs->lsp)) | 
|  | 870 | +   (t | 
|  | 871 | +    (remove-hook 'treemacs-create-project-functions #'lsp-treemacs--on-folder-added) | 
|  | 872 | +    (remove-hook 'treemacs-delete-project-functions #'lsp-treemacs--on-folder-remove) | 
|  | 873 | +    (remove-hook 'lsp-workspace-folders-changed-hook #'lsp-treemacs--sync-folders) | 
|  | 874 | +    (remove-hook 'treemacs-workspace-edit-hook #'lsp-treemacs--treemacs->lsp) | 
|  | 875 | +    (remove-hook 'treemacs-switch-workspace-hook #'lsp-treemacs--treemacs->lsp)))) | 
|  | 876 | + | 
|  | 877 | + | 
| 815 | 878 | 
 | 
| 816 | 879 | (provide 'lsp-treemacs) | 
| 817 | 880 | ;;; lsp-treemacs.el ends here | 
|  | 
0 commit comments