Increment parser timestamp when narrowing changes (bug#67977)

When narrowing changes, parse reparses, so the timestamp should
definitely increment, just like in ts_record_changes.

Failing to increment this timestamp, outdated nodes would think they
are still up-to-date, and try to print their type name.  Printing
their type name involves accessing the old parse tree, which is
already freed during the last reparse.

I also found that we don't increment timestamp when changing parser
ranges and fixed that as well.

* src/treesit.c (treesit_sync_visible_region):
(Ftreesit_parser_set_included_ranges): Increment timestamp.
* src/treesit.h (Lisp_TS_Parser): Add some comments.
This commit is contained in:
Yuan Fu 2023-12-23 16:47:04 -08:00
parent 8ae42c825e
commit 683c7c9687
No known key found for this signature in database
GPG key ID: 56E19BC57664A442
2 changed files with 8 additions and 2 deletions

View file

@ -931,7 +931,10 @@ treesit_sync_visible_region (Lisp_Object parser)
this function is called), we need to reparse. */ this function is called), we need to reparse. */
if (visible_beg != BUF_BEGV_BYTE (buffer) if (visible_beg != BUF_BEGV_BYTE (buffer)
|| visible_end != BUF_ZV_BYTE (buffer)) || visible_end != BUF_ZV_BYTE (buffer))
XTS_PARSER (parser)->need_reparse = true; {
XTS_PARSER (parser)->need_reparse = true;
XTS_PARSER (parser)->timestamp++;
}
/* Before we parse or set ranges, catch up with the narrowing /* Before we parse or set ranges, catch up with the narrowing
situation. We change visible_beg and visible_end to match situation. We change visible_beg and visible_end to match
@ -1671,6 +1674,7 @@ buffer. */)
ranges); ranges);
XTS_PARSER (parser)->need_reparse = true; XTS_PARSER (parser)->need_reparse = true;
XTS_PARSER (parser)->timestamp++;
return Qnil; return Qnil;
} }

View file

@ -53,7 +53,9 @@ struct Lisp_TS_Parser
/* Re-parsing an unchanged buffer is not free for tree-sitter, so we /* Re-parsing an unchanged buffer is not free for tree-sitter, so we
only make it re-parse when need_reparse == true. That usually only make it re-parse when need_reparse == true. That usually
means some change is made in the buffer. But others could set means some change is made in the buffer. But others could set
this field to true to force tree-sitter to re-parse. */ this field to true to force tree-sitter to re-parse. When you
set this to true, you should _always_ also increment
timestamp. */
bool need_reparse; bool need_reparse;
/* These two positions record the buffer byte position (1-based) of /* These two positions record the buffer byte position (1-based) of
the "visible region" that tree-sitter sees. Before re-parse, we the "visible region" that tree-sitter sees. Before re-parse, we