aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuan Fu2023-02-17 14:21:49 -0800
committerYuan Fu2023-02-17 14:27:23 -0800
commit0a5615669a4f5d7e2db3c4117f3c2440e9c4cfd5 (patch)
tree97ed6e6fa97f76b894a886b3bd896d66d2b5bf43
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.
-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);