]> git.eshelyaron.com Git - emacs.git/commit
Fix treesit function ts_record_change and friends
authorYuan Fu <yuan@debian-BULLSEYE-live-builder-AMD64>
Thu, 16 Jun 2022 04:53:15 +0000 (21:53 -0700)
committerYuan Fu <yuan@debian-BULLSEYE-live-builder-AMD64>
Thu, 16 Jun 2022 18:52:04 +0000 (11:52 -0700)
commit7cee82a91d287e42e6596960cbee17157cde4b29
treeeb6ec90eaacdc78137d87fc63632a18226027735
parentbd1b27b7c7bbd969cf76409499bb84a83600c42a
Fix treesit function ts_record_change and friends

In ts_record_change, the way we calculate tree-sitter change was
wrong:

    ptrdiff_t affected_start =
      max (visible_beg, start_byte) - visible_beg;
    ptrdiff_t affected_old_end =
      min (visible_end, affected_start + bytes_del);
    ptrdiff_t affected_new_end =
      affected_start + bytes_ins;

I changed it to below (also renamed variables)

    ptrdiff_t start_offset =
      min (visible_end,
           max (visible_beg, start_byte)) - visible_beg;
    ptrdiff_t old_end_offset =
      min (visible_end,
           max (visible_beg, old_end_byte)) - visible_beg;
    ptrdiff_t new_end_offset =
      min (visible_end,
           max (visible_beg, new_end_byte)) - visible_beg;

Also previously only visible_end is changed (in a wrong way)

    XTS_PARSER (lisp_parser)->visible_end = affected_new_end;

Now we have a whole new bunch of code that makes the right change.

* src/treesit.c (ts_tree_edit_1): Add assertion.
(ts_record_change): See above.
(ts_ensure_position_synced): Add assertion.
(ts_ensure_parsed): Only free if non-NULL.
(make_ts_parser): Add assertion.
(Ftreesit_parser_set_included_ranges): Ensure parsed before setting ranges.
(Ftreesit_parser_included_ranges): Add assertion.
src/treesit.c