Fix treesit-parser-create behavior regarding indirect buffers

The previous fix fixed the problem that treesit-parser-create
always use the current buffer, but that introduce another subtle
problem: if an indirect buffer creates a parser, the parser
saves the base buffer rather than the indirect buffer.  In Emacs
29, if you create a parser in an indirect buffer, the parser
saves the indirect buffer.  This change of behavior breaks some
existing use-cases for people using indirect buffer with
tree-sitter.

In Emacs 31, indirect buffers and base buffer get their own
parser list, so this problem doesn't exist anymore.  The fix is
only for Emacs 30.

* src/treesit.c (Ftreesit_parser_create): Use the buffer that's
given to treesit-parser-create, even if it's an indirect buffer.
This commit is contained in:
Yuan Fu 2025-03-13 00:33:47 -07:00
parent 20ac26e675
commit defc55bb6f
No known key found for this signature in database
GPG key ID: 56E19BC57664A442

View file

@ -1560,6 +1560,9 @@ an indirect buffer. */)
CHECK_BUFFER (buffer);
buf = XBUFFER (buffer);
}
struct buffer *buffer_given = buf;
if (buf->base_buffer)
buf = buf->base_buffer;
@ -1595,7 +1598,7 @@ an indirect buffer. */)
/* Create parser. */
Lisp_Object lisp_buf;
XSETBUFFER (lisp_buf, buf);
XSETBUFFER (lisp_buf, buffer_given);
Lisp_Object lisp_parser = make_treesit_parser (lisp_buf,
parser, NULL,
language, tag);