[Top][All Lists]

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

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

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

branch: externals/elpa
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
    * 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]