Function: treesit-parser-create
treesit-parser-create is a function defined in treesit.c.
Signature
(treesit-parser-create LANGUAGE &optional BUFFER NO-REUSE TAG)
Documentation
Create and return a parser in BUFFER for LANGUAGE with TAG.
The parser is automatically added to BUFFER's parser list, as returned
by treesit-parser-list. LANGUAGE is a language symbol. If BUFFER
is nil or omitted, it defaults to the current buffer. If BUFFER
already has a parser for LANGUAGE with TAG, return that parser, but if
NO-REUSE is non-nil, always create a new parser.
TAG can be any symbol except t, and defaults to nil. Different parsers can have the same tag.
If that buffer is an indirect buffer, its base buffer is used instead. That is, indirect buffers use their base buffer's parsers. Lisp programs should widen as necessary should they want to use a parser in an indirect buffer.
Other relevant functions are documented in the treesit group.
Shortdoc
;; treesit
(treesit-parser-create 'c)
e.g. => #<treesit-parser for c>
Source Code
// Defined in /usr/src/emacs/src/treesit.c
{
treesit_initialize ();
CHECK_SYMBOL (language);
CHECK_SYMBOL (tag);
struct buffer *buf;
if (NILP (buffer))
buf = current_buffer;
else
{
CHECK_BUFFER (buffer);
buf = XBUFFER (buffer);
}
struct buffer *buffer_given = buf;
if (buf->base_buffer)
buf = buf->base_buffer;
if (EQ (tag, Qt))
xsignal2(Qwrong_type_argument, list2(Qnot, Qt), Qt);
treesit_check_buffer_size (buf);
/* See if we can reuse a parser. */
if (NILP (no_reuse))
{
Lisp_Object tail = BVAR (buf, ts_parser_list);
FOR_EACH_TAIL (tail)
{
struct Lisp_TS_Parser *parser = XTS_PARSER (XCAR (tail));
if (EQ (parser->tag, tag)
&& EQ (parser->language_symbol, language))
return XCAR (tail);
}
}
/* Load language. */
Lisp_Object signal_symbol = Qnil;
Lisp_Object signal_data = Qnil;
TSParser *parser = ts_parser_new ();
TSLanguage *lang = treesit_load_language (language, &signal_symbol,
&signal_data);
if (lang == NULL)
xsignal (signal_symbol, signal_data);
/* We check language version when loading a language, so this should
always succeed. */
ts_parser_set_language (parser, lang);
/* Create parser. */
Lisp_Object lisp_buf;
XSETBUFFER (lisp_buf, buffer_given);
Lisp_Object lisp_parser = make_treesit_parser (lisp_buf,
parser, NULL,
language, tag);
/* Update parser-list. */
BVAR (buf, ts_parser_list) = Fcons (lisp_parser, BVAR (buf, ts_parser_list));
return lisp_parser;
}