This function returns the list of @var{parser}'s notifier functions.
@end defun
+@heading Substitute parser for another language
+@cindex remap language grammar, tree-sitter
+@cindex replace language grammar, tree-sitter
+@cindex replace parser language, tree-sitter
+@cindex extended grammar, tree-sitter
+
+Sometimes, a grammar for language B is a strict superset of the grammar
+of another language A. Then it makes sense to reuse configurations
+(font-lock rules, indentation rules, etc.) of language A for language B.
+For that purpose, @var{treesit-language-remap-alist} allows users to
+remap language A into language B.
+
+@defvar treesit-language-remap-alist
+The value of this variable should be an alist of
+@w{@code{(@var{language-a} . @var{language-b})}}. When such pair exists
+in the alist, creating a parser for @var{language-a} actually creates a
+parser for @var{language-b}. By extension, anything that creates a node
+or makes a query of @var{language-a} will be redirected to use
+@var{language-b} instead.
+
+Note that calling @code{treesit-parser-language} on a parser for
+@var{language-a} still returns @var{language-a}.
+@end defvar
+
@node Retrieving Nodes
@section Retrieving Nodes
@cindex retrieve node, tree-sitter
return treesit_query;
}
+/* Resolve language symbol LANG according to
+ treesit-language-remap-alist. */
+static
+Lisp_Object resolve_language_symbol (Lisp_Object lang)
+{
+ Lisp_Object res = Fassoc (lang, Vtreesit_language_remap_alist, Qeq);
+ if (NILP (res))
+ return lang;
+ return Fcdr (res);
+}
+
\f
/* Lisp definitions. */
treesit_check_buffer_size (buf);
+ language = resolve_language_symbol (language);
+ CHECK_SYMBOL (language);
+
/* See if we can reuse a parser. */
if (NILP (no_reuse))
{
if (buf->base_buffer)
buf = buf->base_buffer;
+ language = resolve_language_symbol (language);
+
/* Return a fresh list so messing with that list doesn't affect our
internal data. */
Lisp_Object return_list = Qnil;
the symbol of that THING. For example, (or sexp sentence). */);
Vtreesit_thing_settings = Qnil;
+ DEFVAR_LISP ("treesit-language-remap-alist",
+ Vtreesit_language_remap_alist,
+ doc:
+ /* An alist remapping language symbols.
+
+The value should be an alist of (LANGUAGE-A . LANGUAGE-B). When such
+pair exists in the alist, creating a parser for LANGUAGE-A actually
+creates a parser for LANGUAGE-B. Basically, anything that requires or
+applies to LANGUAGE-A will be redirected to LANGUAGE-B instead. */);
+ Vtreesit_language_remap_alist = Qnil;
+ DEFSYM (Qtreesit_language_remap_alist, "treesit-language-remap-alist");
+ Fmake_variable_buffer_local (Qtreesit_language_remap_alist);
+
staticpro (&Vtreesit_str_libtree_sitter);
Vtreesit_str_libtree_sitter = build_pure_c_string ("libtree-sitter-");
staticpro (&Vtreesit_str_tree_sitter);