|
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 | + (cond |
| 863 | + (lsp-treemacs-sync-mode |
| 864 | + (add-hook 'treemacs-create-project-functions #'lsp-treemacs--on-folder-added) |
| 865 | + (add-hook 'treemacs-delete-project-functions #'lsp-treemacs--on-folder-remove) |
| 866 | + (add-hook 'lsp-workspace-folders-changed-hook #'lsp-treemacs--sync-folders) |
| 867 | + (add-hook 'treemacs-workspace-edit-hook #'lsp-treemacs--treemacs->lsp) |
| 868 | + (add-hook 'treemacs-switch-workspace-hook #'lsp-treemacs--treemacs->lsp)) |
| 869 | + (t |
| 870 | + (remove-hook 'treemacs-create-project-functions #'lsp-treemacs--on-folder-added) |
| 871 | + (remove-hook 'treemacs-delete-project-functions #'lsp-treemacs--on-folder-remove) |
| 872 | + (remove-hook 'lsp-workspace-folders-changed-hook #'lsp-treemacs--sync-folders) |
| 873 | + (remove-hook 'treemacs-workspace-edit-hook #'lsp-treemacs--treemacs->lsp) |
| 874 | + (remove-hook 'treemacs-switch-workspace-hook #'lsp-treemacs--treemacs->lsp)))) |
| 875 | + |
| 876 | + |
815 | 877 |
|
816 | 878 | (provide 'lsp-treemacs)
|
817 | 879 | ;;; lsp-treemacs.el ends here
|
|
0 commit comments