]> git.eshelyaron.com Git - emacs.git/commitdiff
Eglot: better fix for bug#70724
authorJoão Távora <joaotavora@gmail.com>
Thu, 6 Jun 2024 22:08:28 +0000 (17:08 -0500)
committerEshel Yaron <me@eshelyaron.com>
Fri, 7 Jun 2024 10:44:30 +0000 (12:44 +0200)
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

(cherry picked from commit 6906ed28f1b4ac0cf0a2a725e7402290f33c26e2)

lisp/progmodes/eglot.el

index 6b4c00fdb5505bbaeab505c5d635ca950fb395f6..2dad68644299a77d18512c3efb0fad1a6cc14225 100644 (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