Function: eglot--semtok-request
eglot--semtok-request is a byte-compiled function defined in
eglot.el.gz.
Signature
(eglot--semtok-request BEG END)
Documentation
Ask for tokens. Arrange for BEG..END to be font-lock flushed.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/eglot.el.gz
(cl-defun eglot--semtok-request (beg end &aux (docver eglot--docver))
"Ask for tokens. Arrange for BEG..END to be font-lock flushed."
(cl-macrolet ((c (tag) `(plist-get eglot--semtok-state ,tag)))
(cl-labels
((req (method &optional params cont
&aux (buf (current-buffer)))
(setf (c :req-docver) docver
(c :orig-docver) docver
(c :dispatched) (not eglot--recent-changes)
(c :regions) (cons (cons (copy-marker beg) (copy-marker end)) (c :regions)))
;; (trace-values "Request" method)
(eglot--async-request
(eglot--current-server-or-lose) method
(append (nconc params `(:textDocument ,(eglot--TextDocumentIdentifier))))
:success-fn
(lambda (response)
(eglot--when-live-buffer buf
;; (trace-values "Response"
;; eglot--docver docver (c :orig-docver) (c :req-docver))
;; This skip is different from the one below. Comparing
;; the lexical `docver' to the original request's
;; `:orig-docver' allows skipping the outdated response
;; of a dispatched request that has been overridden by
;; another (perhaps not dispatched yet) request.
(when (eq docver (c :orig-docver))
(setf (c :docver) (c :req-docver)
(c :data) (if cont (funcall cont response)
(plist-get response :data))
(c :resultId) (plist-get response :resultId))
;; (trace-values "Flushing" (length (c :regions)) "regions")
(cl-loop for (a . b) in (c :regions) do (font-lock-flush a b))
(setf (c :regions) nil))))
:hint 'semtok)))
;; Skip actually making the request if there's an undispatched
;; waiting for a eglot--send-changes-hook flush. Just update the
;; regions and the `:req-docver'.
(unless (or (null (c :req-docver)) (c :dispatched))
(push (cons (copy-marker beg) (copy-marker end)) (c :regions))
(setf (c :req-docver) eglot--docver)
(cl-return-from eglot--semtok-request 'skipped))
(cond
((and (eglot-server-capable :semanticTokensProvider :full :delta)
(c :data))
(req :textDocument/semanticTokens/full/delta
`(:previousResultId ,(c :resultId))
(let ((data (c :data) ))
(lambda (response)
(if-let* ((edits (plist-get response :edits)))
(eglot--semtok-apply-delta-edits data edits)
(plist-get response :data))))))
(t
(req :textDocument/semanticTokens/full))))))