]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't exceed max-specdl-size in big go projects
authorJoão Távora <joaotavora@gmail.com>
Sun, 18 Sep 2022 09:15:43 +0000 (10:15 +0100)
committerJoão Távora <joaotavora@gmail.com>
Sun, 18 Sep 2022 09:15:43 +0000 (10:15 +0100)
When invoking client/registerCapability for
workspace/didChangeWatchedFiles, Gopls lists each file to watch
separately.  This makes eglot--glob-emit-{} emit a closure with an
'or' form containing a potentially large number of 're-search-forward'
forms.

For large Go project such as "Kubernetes", this list becomes so large
that -- for some reason I don't understand -- it triggers the
'max-specdl-size' limit.

An alternative using `regexp` opt doesn't seem to trigger the error.

* eglot.el (eglot--glob-emit-{}): Use regexp-opt.

GitHub-reference: fix https://github.com/joaotavora/eglot/issues/633
GitHub-reference: fix https://github.com/joaotavora/eglot/issues/1067

lisp/progmodes/eglot.el

index 493bfcc7d6ca3c878ba31dc7cf661ff8e4968462..038847c78f61909bf731e6cd2f33254e0c065d38 100644 (file)
@@ -3260,8 +3260,7 @@ If NOERROR, return predicate, else erroring function."
 (defun eglot--glob-emit-{} (arg self next)
   (let ((alternatives (split-string (substring arg 1 (1- (length arg))) ",")))
     `(,self ()
-            (or ,@(cl-loop for alt in alternatives
-                           collect `(re-search-forward ,(concat "\\=" alt) nil t))
+            (or (re-search-forward ,(concat "\\=" (regexp-opt alternatives)) nil t)
                 (error "Failed matching any of %s" ',alternatives))
             (,next))))