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.

View in manual

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;
}