aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoão Távora2024-06-06 17:08:28 -0500
committerJoão Távora2024-06-06 17:13:57 -0500
commit6906ed28f1b4ac0cf0a2a725e7402290f33c26e2 (patch)
tree942f0d5c8359424517e737c08579dea38af0f0d5
parentb571c6571c8bc4c34569650104aee273c19cbfd4 (diff)
downloademacs-6906ed28f1b4ac0cf0a2a725e7402290f33c26e2.tar.gz
emacs-6906ed28f1b4ac0cf0a2a725e7402290f33c26e2.zip
Eglot: better fix for bug#70724
If the project's root is or destroyed , this may happen for a variety of reasons, including reasons affecting non-reconnection scenarios, so better to check in eglot--connect. An Eglot "reconnection" has always created as accurate a copy of the previous server object as possible, down to the 'eq'ness or the saved initargs, language ids, etc. So re-querying for projects is not the thing to do here. A new different server can be created with `M-x eglot` which will ask about shutting down the existing one. * lisp/progmodes/eglot.el (eglot-reconnect): Revert previous change. (eglot--connect): Do sanity check here
-rw-r--r--lisp/progmodes/eglot.el21
1 files changed, 11 insertions, 10 deletions
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index f58a895a3f1..03da5c7b22a 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -1419,15 +1419,11 @@ INTERACTIVE is t if called interactively."
1419 (interactive (list (eglot--current-server-or-lose) t)) 1419 (interactive (list (eglot--current-server-or-lose) t))
1420 (when (jsonrpc-running-p server) 1420 (when (jsonrpc-running-p server)
1421 (ignore-errors (eglot-shutdown server interactive nil 'preserve-buffers))) 1421 (ignore-errors (eglot-shutdown server interactive nil 'preserve-buffers)))
1422 (let* ((default-directory (project-root (eglot--project server))) 1422 (eglot--connect (eglot--major-modes server)
1423 (project (eglot--current-project))) 1423 (eglot--project server)
1424 (if (not project) 1424 (eieio-object-class-name server)
1425 (eglot--error "Project in `%s' is gone!" default-directory) 1425 (eglot--saved-initargs server)
1426 (eglot--connect (eglot--major-modes server) 1426 (eglot--language-ids server))
1427 project
1428 (eieio-object-class-name server)
1429 (eglot--saved-initargs server)
1430 (eglot--language-ids server))))
1431 (eglot--message "Reconnected!")) 1427 (eglot--message "Reconnected!"))
1432 1428
1433(defvar eglot--managed-mode) ; forward decl 1429(defvar eglot--managed-mode) ; forward decl
@@ -1518,7 +1514,12 @@ Each function is passed the server as an argument")
1518This docstring appeases checkdoc, that's all." 1514This docstring appeases checkdoc, that's all."
1519 (let* ((default-directory (project-root project)) 1515 (let* ((default-directory (project-root project))
1520 (nickname (project-name project)) 1516 (nickname (project-name project))
1521 (readable-name (format "EGLOT (%s/%s)" nickname managed-modes)) 1517 (readable-name
1518 (progn
1519 (unless (file-exists-p default-directory)
1520 ;; could happen because of bug#70724 or just because
1521 (eglot--error "Project '%s' is gone!" nickname))
1522 (format "EGLOT (%s/%s)" nickname managed-modes)))
1522 server-info 1523 server-info
1523 (contact (if (functionp contact) (funcall contact) contact)) 1524 (contact (if (functionp contact) (funcall contact) contact))
1524 (initargs 1525 (initargs