Function: eglot--dcase
eglot--dcase is a macro defined in eglot.el.gz.
Signature
(eglot--dcase OBJ &rest CLAUSES)
Documentation
Like pcase, but for the LSP object OBJ.
CLAUSES is a list (DESTRUCTURE FORMS...) where DESTRUCTURE is
treated as in eglot--dbind.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/eglot.el.gz
(cl-defmacro eglot--dcase (obj &rest clauses)
"Like `pcase', but for the LSP object OBJ.
CLAUSES is a list (DESTRUCTURE FORMS...) where DESTRUCTURE is
treated as in `eglot--dbind'."
(declare (indent 1) (debug (sexp &rest (sexp &rest form))))
(let ((obj-once (make-symbol "obj-once")))
`(let ((,obj-once ,obj))
(cond
,@(cl-loop
for (vars . body) in clauses
for vars-as-keywords = (eglot--keywordize-vars vars)
for interface-name = (if (consp (car vars))
(car (pop vars)))
for condition =
(cond (interface-name
(eglot--check-dspec interface-name vars)
;; In this mode, in runtime, we assume
;; `eglot-strict-mode' is partially on, otherwise we
;; can't disambiguate between certain types.
`(ignore-errors
(eglot--check-object
',interface-name ,obj-once
t
(memq 'disallow-non-standard-keys eglot-strict-mode)
t)))
(t
;; In this interface-less mode we don't check
;; `eglot-strict-mode' at all: just check that the object
;; has all the keys the user wants to destructure.
`(null (cl-set-difference
',vars-as-keywords
(eglot--plist-keys ,obj-once)))))
collect `(,condition
(cl-destructuring-bind (&key ,@vars &allow-other-keys)
,obj-once
,@body)))
(t
(eglot--error "%S didn't match any of %S"
,obj-once
',(mapcar #'car clauses)))))))