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

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

[elpa] externals/eglot 77856c2 130/139: Reinstate the catch/loop/throw i


From: João Távora
Subject: [elpa] externals/eglot 77856c2 130/139: Reinstate the catch/loop/throw idiom in eglot-request
Date: Mon, 14 May 2018 09:55:10 -0400 (EDT)

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

    Reinstate the catch/loop/throw idiom in eglot-request
    
    This reverts parts of commit 29f58a6514aec28e4e6df9611e4f58c7289e3cc6.
    
    Unfortunately, this may cause problems when calling the error
    callbacks directly as in the process sentinel. In that particular
    scenario the accept-process-output won't have return, because no
    output has is being handled. Consequently, if we're unlucky, we have
    another 30 seconds to way before the flag is tested and the loop
    exits.
    
    * eglot.el (eglot-request): Use catch/loop/throw again
---
 eglot.el | 33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/eglot.el b/eglot.el
index 13f6f61..6f90349 100644
--- a/eglot.el
+++ b/eglot.el
@@ -651,20 +651,25 @@ DEFERRED is passed to `eglot--async-request', which see."
   ;; bad idea, since that might lead to the request never having a
   ;; chance to run, because `eglot--ready-predicates'.
   (when deferred (eglot--signal-textDocument/didChange))
-  (let ((retval))
-    (eglot--async-request
-     proc method params
-     :success-fn (lambda (&rest args)
-                   (setq retval `(done ,(if (vectorp (car args))
-                                            (car args) args))))
-     :error-fn (eglot--lambda (&key code message &allow-other-keys)
-                 (setq retval `(error ,(format "Oops: %s: %s" code message))))
-     :timeout-fn (lambda ()
-                   (setq retval '(error "Timed out")))
-     :deferred deferred)
-    (while (not retval) (accept-process-output nil 30))
-    (when (eq 'error (car retval)) (eglot--error (cadr retval)))
-    (cadr retval)))
+  (let* ((done (make-symbol "eglot--request-catch-tag"))
+         (res
+          (catch done (eglot--async-request
+                       proc method params
+                       :success-fn (lambda (&rest args)
+                                     (throw done (if (vectorp (car args))
+                                                     (car args) args)))
+                       :error-fn (eglot--lambda
+                                     (&key code message &allow-other-keys)
+                                   (throw done
+                                          `(error ,(format "Oops: %s: %s"
+                                                           code message))))
+                       :timeout-fn (lambda ()
+                                     (throw done '(error "Timed out")))
+                       :deferred deferred)
+                 ;; now spin, baby!
+                 (while t (accept-process-output nil 0.01)))))
+    (when (and (listp res) (eq 'error (car res))) (eglot--error (cadr res)))
+    res))
 
 (cl-defun eglot--notify (process method params)
   "Notify PROCESS of something, don't expect a reply.e"



reply via email to

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