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

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

[elpa] externals/elpa f76f04e 057/139: More correctly keep track of didO


From: João Távora
Subject: [elpa] externals/elpa f76f04e 057/139: More correctly keep track of didOpen/didClose per buffer
Date: Mon, 14 May 2018 09:53:34 -0400 (EDT)

branch: externals/elpa
commit f76f04e1226dc6a3ebe7b913ee9c6ddaef73634e
Author: João Távora <address@hidden>
Commit: João Távora <address@hidden>

    More correctly keep track of didOpen/didClose per buffer
    
    * eglot.el (eglot--buffer-open-count): Now a process-local var.
    (eglot--signal-textDocument/didOpen, eglot--signal-textDocument/didClose):
    Use it.
---
 eglot.el | 42 +++++++++++++++++++++++++++---------------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/eglot.el b/eglot.el
index bdd339d..ac52b9a 100644
--- a/eglot.el
+++ b/eglot.el
@@ -138,6 +138,9 @@ A list (WHAT SERIOUS-P)." t)
 Must be a function of one arg, a name, returning a process
 object.")
 
+(eglot--define-process-var eglot--buffer-open-count (make-hash-table)
+  "Keeps track of didOpen/didClose notifs for each buffer.")
+
 (defun eglot-make-local-process (name command)
   "Make a local LSP process from COMMAND.
 NAME is a name to give the inferior process or connection.
@@ -1026,26 +1029,35 @@ Records START, END and PRE-CHANGE-LENGTH locally."
   (setq eglot--recent-before-changes nil
         eglot--recent-after-changes nil))
 
-(defvar-local eglot--buffer-open-count 0)
 (defun eglot--signal-textDocument/didOpen ()
   "Send textDocument/didOpen to server."
-  (cl-incf eglot--buffer-open-count)
-  (when (> eglot--buffer-open-count 1)
-    (error "Too many textDocument/didOpen notifs for %s" (current-buffer)))
-  (eglot--notify (eglot--current-process-or-lose)
-                 :textDocument/didOpen
-                 (eglot--obj :textDocument
-                             (eglot--current-buffer-TextDocumentItem))))
+  (let* ((proc (eglot--current-process-or-lose))
+         (count (1+ (or (gethash (current-buffer)
+                                 (eglot--buffer-open-count proc))
+                        0))))
+    (when (> count 1)
+      (eglot--error "Too many textDocument/didOpen notifs for %s" 
(current-buffer)))
+    (setf (gethash (current-buffer) (eglot--buffer-open-count proc))
+          count)
+    (eglot--notify proc
+                   :textDocument/didOpen
+                   (eglot--obj :textDocument
+                               (eglot--current-buffer-TextDocumentItem)))))
 
 (defun eglot--signal-textDocument/didClose ()
   "Send textDocument/didClose to server."
-  (cl-decf eglot--buffer-open-count)
-  (when (< eglot--buffer-open-count 0)
-    (error "Too many textDocument/didClose notifs for %s" (current-buffer)))
-  (eglot--notify (eglot--current-process-or-lose)
-                 :textDocument/didClose
-                 (eglot--obj :textDocument
-                             (eglot--current-buffer-TextDocumentItem))))
+  (let* ((proc (eglot--current-process-or-lose))
+         (count (1- (or (gethash (current-buffer)
+                                 (eglot--buffer-open-count proc))
+                        0))))
+    (when (< count 0)
+      (eglot--error "Too many textDocument/didClose notifs for %s" 
(current-buffer)))
+    (setf (gethash (current-buffer) (eglot--buffer-open-count proc))
+          count)
+    (eglot--notify proc
+                   :textDocument/didClose
+                   (eglot--obj :textDocument
+                               (eglot--current-buffer-TextDocumentItem)))))
 
 (defun eglot--signal-textDocument/willSave ()
   "Send textDocument/willSave to server."



reply via email to

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