Function: treesit-parser-set-included-ranges
treesit-parser-set-included-ranges is a function defined in treesit.c.
Signature
(treesit-parser-set-included-ranges PARSER RANGES)
Documentation
Limit PARSER to RANGES.
RANGES is a list of (BEG . END), each (BEG . END) defines a region in
which the parser should operate. Regions must not overlap, and the
regions should come in order in the list. Signal
treesit-set-range-error if the argument is invalid, or something
else went wrong. If RANGES is nil, the PARSER is to parse the whole
buffer.
Other relevant functions are documented in the treesit group.
Shortdoc
;; treesit
(treesit-parser-set-included-ranges parser '((1 . 4) (5 . 8)))
Source Code
// Defined in /usr/src/emacs/src/treesit.c
{
treesit_check_parser (parser);
if (!NILP (ranges))
CHECK_CONS (ranges);
treesit_check_range_argument (ranges);
treesit_initialize ();
/* Before we parse, catch up with narrowing/widening. */
treesit_check_buffer_size (XBUFFER (XTS_PARSER (parser)->buffer));
treesit_sync_visible_region (parser);
bool success;
if (NILP (ranges))
{
XTS_PARSER (parser)->has_range = false;
/* If RANGES is nil, make parser to parse the whole document.
To do that we give tree-sitter a 0 length, the range is a
dummy. */
TSRange treesit_range = {{0, 0}, {0, 0}, 0, 0};
success = ts_parser_set_included_ranges (XTS_PARSER (parser)->parser,
&treesit_range , 0);
}
else
{
/* Set ranges for PARSER. */
XTS_PARSER (parser)->has_range = true;
if (list_length (ranges) > UINT32_MAX)
xsignal (Qargs_out_of_range, list2 (ranges, Flength (ranges)));
uint32_t len = (uint32_t) list_length (ranges);
TSRange *treesit_ranges = xmalloc (sizeof (TSRange) * len);
struct buffer *buffer = XBUFFER (XTS_PARSER (parser)->buffer);
for (int idx = 0; !NILP (ranges); idx++, ranges = XCDR (ranges))
{
Lisp_Object range = XCAR (ranges);
ptrdiff_t beg_byte = buf_charpos_to_bytepos (buffer,
XFIXNUM (XCAR (range)));
ptrdiff_t end_byte = buf_charpos_to_bytepos (buffer,
XFIXNUM (XCDR (range)));
/* Shouldn't violate assertion since we just checked for
buffer size at the beginning of this function. */
eassert (beg_byte - BUF_BEGV_BYTE (buffer) <= UINT32_MAX);
eassert (end_byte - BUF_BEGV_BYTE (buffer) <= UINT32_MAX);
/* We don't care about start and end points, put in dummy
values. */
TSRange rg = {{0, 0}, {0, 0},
(uint32_t) beg_byte - BUF_BEGV_BYTE (buffer),
(uint32_t) end_byte - BUF_BEGV_BYTE (buffer)};
treesit_ranges[idx] = rg;
}
success = ts_parser_set_included_ranges (XTS_PARSER (parser)->parser,
treesit_ranges, len);
/* Although XFIXNUM could signal, it should be impossible
because we have checked the input by treesit_check_range_argument.
So there is no need for unwind-protect. */
xfree (treesit_ranges);
}
if (!success)
xsignal2 (Qtreesit_range_invalid,
build_string ("Something went wrong when setting ranges"),
ranges);
XTS_PARSER (parser)->need_reparse = true;
XTS_PARSER (parser)->timestamp++;
return Qnil;
}