aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYuan Fu2023-02-17 14:21:49 -0800
committerYuan Fu2023-02-17 14:27:23 -0800
commit0a5615669a4f5d7e2db3c4117f3c2440e9c4cfd5 (patch)
tree97ed6e6fa97f76b894a886b3bd896d66d2b5bf43 /src
parent5b34fc07085a4ec636124756d09dcc3be8414eb8 (diff)
downloademacs-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.
Diffstat (limited to 'src')
-rw-r--r--src/treesit.c15
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);