diff options
| author | Yuan Fu | 2023-02-17 14:21:49 -0800 |
|---|---|---|
| committer | Yuan Fu | 2023-02-17 14:27:23 -0800 |
| commit | 0a5615669a4f5d7e2db3c4117f3c2440e9c4cfd5 (patch) | |
| tree | 97ed6e6fa97f76b894a886b3bd896d66d2b5bf43 | |
| parent | 5b34fc07085a4ec636124756d09dcc3be8414eb8 (diff) | |
| download | emacs-0a5615669a4f5d7e2db3c4117f3c2440e9c4cfd5.tar.gz emacs-0a5615669a4f5d7e2db3c4117f3c2440e9c4cfd5.zip | |
Don't completely clip into visible range in treesit_record_change
(Bug#61369)
From
min (visible_end, max (visible_beg, new_end_byte)) - visible_beg
to
max (visible_beg, new_end_byte) - visible_beg
* src/treesit.c (treesit_record_change): We don't clip the new end
into the visible range anymore. If you think of it, when inserting in
a narrowed region, the visible region is always extended to
accommodate more text, rather than pushing text at the end to keep the
size of the visible region.
| -rw-r--r-- | src/treesit.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/treesit.c b/src/treesit.c index cab2f0d5354..08119f149b7 100644 --- a/src/treesit.c +++ b/src/treesit.c | |||
| @@ -770,7 +770,8 @@ treesit_record_change (ptrdiff_t start_byte, ptrdiff_t old_end_byte, | |||
| 770 | treesit_check_parser (lisp_parser); | 770 | treesit_check_parser (lisp_parser); |
| 771 | TSTree *tree = XTS_PARSER (lisp_parser)->tree; | 771 | TSTree *tree = XTS_PARSER (lisp_parser)->tree; |
| 772 | /* See comment (ref:visible-beg-null) if you wonder why we don't | 772 | /* See comment (ref:visible-beg-null) if you wonder why we don't |
| 773 | update visible_beg/end when tree is NULL. */ | 773 | update visible_beg/end when tree is NULL. */ |
| 774 | |||
| 774 | if (tree != NULL) | 775 | if (tree != NULL) |
| 775 | { | 776 | { |
| 776 | eassert (start_byte <= old_end_byte); | 777 | eassert (start_byte <= old_end_byte); |
| @@ -794,8 +795,14 @@ treesit_record_change (ptrdiff_t start_byte, ptrdiff_t old_end_byte, | |||
| 794 | ptrdiff_t old_end_offset = (min (visible_end, | 795 | ptrdiff_t old_end_offset = (min (visible_end, |
| 795 | max (visible_beg, old_end_byte)) | 796 | max (visible_beg, old_end_byte)) |
| 796 | - visible_beg); | 797 | - visible_beg); |
| 797 | ptrdiff_t new_end_offset = (min (visible_end, | 798 | /* We don't clip new_end_offset under visible_end, because |
| 798 | max (visible_beg, new_end_byte)) | 799 | inserting in narrowed region always extends the visible |
| 800 | region. If we clip new_end_offset here, and re-add the | ||
| 801 | clipped "tail" in treesit_sync_visible_region later, | ||
| 802 | while it is technically equivalent, tree-sitter's | ||
| 803 | incremental parsing algorithm doesn't seem to like it | ||
| 804 | (bug#61369). */ | ||
| 805 | ptrdiff_t new_end_offset = (max (visible_beg, new_end_byte) | ||
| 799 | - visible_beg); | 806 | - visible_beg); |
| 800 | eassert (start_offset <= old_end_offset); | 807 | eassert (start_offset <= old_end_offset); |
| 801 | eassert (start_offset <= new_end_offset); | 808 | eassert (start_offset <= new_end_offset); |
| @@ -817,11 +824,13 @@ treesit_record_change (ptrdiff_t start_byte, ptrdiff_t old_end_byte, | |||
| 817 | /* Move forward. */ | 824 | /* Move forward. */ |
| 818 | visi_beg_delta = (old_end_byte < visible_beg | 825 | visi_beg_delta = (old_end_byte < visible_beg |
| 819 | ? new_end_byte - old_end_byte : 0); | 826 | ? new_end_byte - old_end_byte : 0); |
| 827 | |||
| 820 | XTS_PARSER (lisp_parser)->visible_beg = visible_beg + visi_beg_delta; | 828 | XTS_PARSER (lisp_parser)->visible_beg = visible_beg + visi_beg_delta; |
| 821 | XTS_PARSER (lisp_parser)->visible_end = (visible_end | 829 | XTS_PARSER (lisp_parser)->visible_end = (visible_end |
| 822 | + visi_beg_delta | 830 | + visi_beg_delta |
| 823 | + (new_end_offset | 831 | + (new_end_offset |
| 824 | - old_end_offset)); | 832 | - old_end_offset)); |
| 833 | |||
| 825 | eassert (XTS_PARSER (lisp_parser)->visible_beg >= 0); | 834 | eassert (XTS_PARSER (lisp_parser)->visible_beg >= 0); |
| 826 | eassert (XTS_PARSER (lisp_parser)->visible_beg | 835 | eassert (XTS_PARSER (lisp_parser)->visible_beg |
| 827 | <= XTS_PARSER (lisp_parser)->visible_end); | 836 | <= XTS_PARSER (lisp_parser)->visible_end); |