emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/eglot 1a61522 08/16: Close #32: Cache buffer's managing


From: João Távora
Subject: [elpa] externals/eglot 1a61522 08/16: Close #32: Cache buffer's managing server
Date: Mon, 9 Jul 2018 17:27:13 -0400 (EDT)

branch: externals/eglot
commit 1a615222b2cf46885aee275484e91647bc7c6c85
Author: João Távora <address@hidden>
Commit: João Távora <address@hidden>

    Close #32: Cache buffer's managing server
    
    * eglot.el (eglot--cached-current-server): New variable.
    (eglot--managed-mode-onoff): Set it.
    (eglot--current-server): Read it.
    (eglot--maybe-activate-editing-mode): Add assertion.
---
 eglot.el | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/eglot.el b/eglot.el
index 88746a7..01658f9 100644
--- a/eglot.el
+++ b/eglot.el
@@ -708,23 +708,33 @@ If optional MARKERS, make markers."
     (remove-function (local 'imenu-create-index-function) #'eglot-imenu)
     (setq eglot--current-flymake-report-fn nil))))
 
+(defvar-local eglot--cached-current-server nil
+  "A cached reference to the current EGLOT server.
+Reset in `eglot--managed-mode-onoff'.")
+
 (defun eglot--managed-mode-onoff (server arg)
   "Proxy for function `eglot--managed-mode' with ARG and SERVER."
   (eglot--managed-mode arg)
   (let ((buf (current-buffer)))
-    (if eglot--managed-mode
-        (cl-pushnew buf (eglot--managed-buffers server))
-      (setf (eglot--managed-buffers server)
-            (delq buf (eglot--managed-buffers server))))))
+    (cond (eglot--managed-mode
+           (setq eglot--cached-current-server server)
+           (cl-pushnew buf (eglot--managed-buffers server)))
+          (t
+           (setq eglot--cached-current-server nil)
+           (setf (eglot--managed-buffers server)
+                 (delq buf (eglot--managed-buffers server)))))))
 
 (add-hook 'eglot--managed-mode-hook 'flymake-mode)
 (add-hook 'eglot--managed-mode-hook 'eldoc-mode)
 
 (defun eglot--current-server ()
   "Find the current logical EGLOT server."
-  (let* ((probe (or (project-current) `(transient . ,default-directory))))
-    (cl-find major-mode (gethash probe eglot--servers-by-project)
-             :key #'eglot--major-mode)))
+  (or
+   eglot--cached-current-server
+   (let* ((probe (or (project-current)
+                     `(transient . ,default-directory))))
+     (cl-find major-mode (gethash probe eglot--servers-by-project)
+              :key #'eglot--major-mode))))
 
 (defun eglot--current-server-or-lose ()
   "Return current logical EGLOT server connection or error."
@@ -738,6 +748,12 @@ If optional MARKERS, make markers."
   "Maybe activate mode function `eglot--managed-mode'.
 If SERVER is supplied, do it only if BUFFER is managed by it.  In
 that case, also signal textDocument/didOpen."
+  (unless server
+    (when eglot--cached-current-server
+      (display-warning
+       :eglot "`eglot--cached-current-server' is non-nil, but it should be!\n\
+Please report this as a possible bug.")
+      (setq eglot--cached-current-server nil)))
   ;; Called even when revert-buffer-in-progress-p
   (let* ((cur (and buffer-file-name (eglot--current-server)))
          (server (or (and (null server) cur) (and server (eq server cur) 
cur))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]