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