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
(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))))