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
This commit is contained in:
João Távora 2024-06-06 17:08:28 -05:00
parent b571c6571c
commit 6906ed28f1

View file

@ -1419,15 +1419,11 @@ INTERACTIVE is t if called interactively."
(interactive (list (eglot--current-server-or-lose) t))
(when (jsonrpc-running-p server)
(ignore-errors (eglot-shutdown server interactive nil 'preserve-buffers)))
(let* ((default-directory (project-root (eglot--project server)))
(project (eglot--current-project)))
(if (not project)
(eglot--error "Project in `%s' is gone!" default-directory)
(eglot--connect (eglot--major-modes server)
project
(eieio-object-class-name server)
(eglot--saved-initargs server)
(eglot--language-ids server))))
(eglot--connect (eglot--major-modes server)
(eglot--project server)
(eieio-object-class-name server)
(eglot--saved-initargs server)
(eglot--language-ids server))
(eglot--message "Reconnected!"))
(defvar eglot--managed-mode) ; forward decl
@ -1518,7 +1514,12 @@ Each function is passed the server as an argument")
This docstring appeases checkdoc, that's all."
(let* ((default-directory (project-root project))
(nickname (project-name project))
(readable-name (format "EGLOT (%s/%s)" nickname managed-modes))
(readable-name
(progn
(unless (file-exists-p default-directory)
;; could happen because of bug#70724 or just because
(eglot--error "Project '%s' is gone!" nickname))
(format "EGLOT (%s/%s)" nickname managed-modes)))
server-info
(contact (if (functionp contact) (funcall contact) contact))
(initargs