Function: treesit--update-ranges-local

treesit--update-ranges-local is a byte-compiled function defined in treesit.el.gz.

Signature

(treesit--update-ranges-local HOST-PARSER QUERY EMBEDDED-LANG MODIFIED-TICK EMBED-LEVEL &optional BEG END OFFSET RANGE-FN)

Documentation

Update range for local parsers between BEG and END under HOST-PARSER.

Use QUERY to get the ranges, and make sure each range has a local parser for EMBEDDED-LANG. HOST-PARSER and QUERY must match.

The local parser is stored in an overlay, in the treesit-parser property, the host parser is stored in the treesit-host-parser property.

When this function touches an overlay, it sets the treesit-parser-ov-timestamp property of the overlay to MODIFIED-TICK. This will help Emacs garbage-collect overlays that aren't in use anymore.

EMBED-LEVEL is the embed level for the local parsers being created or updated. When looking for existing local parsers, only look for parsers of this level; when creating new local parsers, set their level to this level.

OFFSET is a cons of start and end offsets that are applied to the range for the local parser.

RANGE-FN, if non-nil, is a function that takes a node and OFFSET, and returns the ranges to use for that node.

Return the created local parsers as a list.

Source Code

;; Defined in /usr/src/emacs/lisp/treesit.el.gz
(defun treesit--update-ranges-local
    ( host-parser query embedded-lang modified-tick embed-level
      &optional beg end offset range-fn)
  "Update range for local parsers between BEG and END under HOST-PARSER.
Use QUERY to get the ranges, and make sure each range has a local
parser for EMBEDDED-LANG.  HOST-PARSER and QUERY must match.

The local parser is stored in an overlay, in the `treesit-parser'
property, the host parser is stored in the `treesit-host-parser'
property.

When this function touches an overlay, it sets the
`treesit-parser-ov-timestamp' property of the overlay to MODIFIED-TICK.
This will help Emacs garbage-collect overlays that aren't in use
anymore.

EMBED-LEVEL is the embed level for the local parsers being created or
updated.  When looking for existing local parsers, only look for parsers
of this level; when creating new local parsers, set their level to this
level.

OFFSET is a cons of start and end offsets that are applied to the range
for the local parser.

RANGE-FN, if non-nil, is a function that takes a node and OFFSET, and
returns the ranges to use for that node.

Return the created local parsers as a list."
  ;; Update range.
  (let ((ranges-by-lang
         (if (functionp embedded-lang)
             (treesit-query-range-by-language
              host-parser query embedded-lang beg end offset range-fn)
           (list (cons embedded-lang
                       (treesit-query-range
                        host-parser query beg end offset range-fn)))))
        (touched-parsers nil))
    (dolist (lang-and-range ranges-by-lang)
      (let ((embedded-lang (car lang-and-range))
            (ranges (cdr lang-and-range)))
        ;; Each element of RANGES can be either (START . END) or ((START
        ;; . END)...).
        (dolist (range ranges)
          (let* ((r-start (treesit--range-start range))
                 (r-end (treesit--range-end range))
                 (existing-local-parser
                  (catch 'done
                    (dolist (ov (overlays-in r-start r-end) nil)
                      ;; Update range of local parser.
                      (when-let* ((embedded-parser
                                   (overlay-get ov 'treesit-parser))
                                  (parser-lang (treesit-parser-language
                                                embedded-parser))
                                  (parser-level (treesit-parser-embed-level
                                                 embedded-parser)))
                        (when (and (overlay-get ov 'treesit-parser-local-p)
                                   (eq parser-lang embedded-lang)
                                   (eq embed-level parser-level))
                          (treesit--set-embed-ranges
                           range embedded-parser host-parser)
                          (move-overlay ov r-start r-end)
                          (overlay-put ov 'treesit-parser-ov-timestamp
                                       modified-tick)
                          (throw 'done embedded-parser)))))))
            (if existing-local-parser
                (push existing-local-parser touched-parsers)
              ;; Create overlay and local parser.  Refer to
              ;; (ref:local-parser-overlay) for more explanation of
              ;; local parser overlays.
              (let ((embedded-parser (treesit-parser-create
                                      embedded-lang nil t 'embedded))
                    (ov (make-overlay r-start r-end nil nil t)))
                (treesit-parser-set-embed-level embedded-parser embed-level)
                (overlay-put ov 'treesit-parser embedded-parser)
                (overlay-put ov 'treesit-parser-local-p t)
                (overlay-put ov 'treesit-host-parser host-parser)
                (overlay-put ov 'treesit-parser-ov-timestamp
                             modified-tick)
                (treesit--set-embed-ranges
                 range embedded-parser host-parser)
                (push embedded-parser touched-parsers)))))))
    touched-parsers))