all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
blob 0dc6491e2d138590c4bc4eed1bdf934abec5bc22 2305 bytes (raw)
name: admin/notes/tree-sitter/treesit_record_change 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
NOTES ON TREESIT_RECORD_CHANGE

It is vital that Emacs informs tree-sitter of every change made to the
buffer, lest tree-sitter's parse tree would be corrupted/out of sync.

All buffer changes in Emacs are made through functions in insdel.c
(and casefiddle.c), I augmented functions in those files with calls to
treesit_record_change.  Below is a manifest of all the relevant
functions in insdel.c as of Emacs 29:

Function                          Calls
----------------------------------------------------------------------
copy_text                         (*1)
insert                            insert_1_both
insert_and_inherit                insert_1_both
insert_char                       insert
insert_string                     insert
insert_before_markers             insert_1_both
insert_before_markers_and_inherit insert_1_both
insert_1_both                     treesit_record_change
insert_from_string                insert_from_string_1
insert_from_string_before_markers insert_from_string_1
insert_from_string_1              treesit_record_change
insert_from_gap_1                 treesit_record_change
insert_from_gap                   insert_from_gap_1
insert_from_buffer                treesit_record_change
insert_from_buffer_1              (used by insert_from_buffer) (*2)
replace_range                     treesit_record_change
replace_range_2                   (caller needs to call treesit_r_c)
del_range                         del_range_1
del_range_1                       del_range_2
del_range_byte                    del_range_2
del_range_both                    del_range_2
del_range_2                       treesit_record_change

(*1) This functions is used only to copy from string to string when
used outside of insdel.c, and when used inside insdel.c, the caller
calls treesit_record_change.

(*2) This function is a static function, and insert_from_buffer is its
only caller.  So it should be fine to call treesit_record_change in
insert_from_buffer but not insert_from_buffer_1.  I also left a
reminder comment.


As for casefiddle.c, do_casify_unibyte_region and
do_casify_multibyte_region modifies buffer, but they are static
functions and are called by casify_region, which calls
treesit_record_change.  Other higher-level functions calls
casify_region to do the work.

debug log:

solving 0dc6491e2d1 ...
found 0dc6491e2d1 in https://git.savannah.gnu.org/cgit/emacs.git

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.