diff options
| author | Yuan Fu | 2022-11-02 17:47:14 -0700 |
|---|---|---|
| committer | Yuan Fu | 2022-11-02 17:47:14 -0700 |
| commit | 88d54756d46101b97b7fde97b4bc3b62f7bd6c06 (patch) | |
| tree | e95a7a2af31576126a35c19662c1d79112c763b4 /src | |
| parent | 32e87f09c8c2711c421363d0361693dcfbe5a688 (diff) | |
| download | emacs-88d54756d46101b97b7fde97b4bc3b62f7bd6c06.tar.gz emacs-88d54756d46101b97b7fde97b4bc3b62f7bd6c06.zip | |
Check for outdated tree-sitter node when printing
* src/print.c (print_vectorlike): Check for outdated node.
* src/treesit.c (treesit_check_node): Use the new function.
(treesit_node_uptodate_p): New function.
* src/treesit.h: Declare new function.
Diffstat (limited to 'src')
| -rw-r--r-- | src/print.c | 10 | ||||
| -rw-r--r-- | src/treesit.c | 9 | ||||
| -rw-r--r-- | src/treesit.h | 2 |
3 files changed, 18 insertions, 3 deletions
diff --git a/src/print.c b/src/print.c index a41ffa6cf04..1749d79299b 100644 --- a/src/print.c +++ b/src/print.c | |||
| @@ -2026,7 +2026,15 @@ print_vectorlike (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag, | |||
| 2026 | case PVEC_TS_NODE: | 2026 | case PVEC_TS_NODE: |
| 2027 | /* Prints #<treesit-node (identifier) in 12-15> or | 2027 | /* Prints #<treesit-node (identifier) in 12-15> or |
| 2028 | #<treesit-node "keyword" in 28-31>. */ | 2028 | #<treesit-node "keyword" in 28-31>. */ |
| 2029 | print_c_string ("#<treesit-node ", printcharfun); | 2029 | print_c_string ("#<treesit-node", printcharfun); |
| 2030 | if (!treesit_node_uptodate_p (obj)) | ||
| 2031 | { | ||
| 2032 | print_c_string ("-outdated>", printcharfun); | ||
| 2033 | break; | ||
| 2034 | } | ||
| 2035 | printchar (' ', printcharfun); | ||
| 2036 | /* Now the node must be up-to-date, and calling functions like | ||
| 2037 | Ftreesit_node_start will not signal. */ | ||
| 2030 | bool named = treesit_named_node_p (XTS_NODE (obj)->node); | 2038 | bool named = treesit_named_node_p (XTS_NODE (obj)->node); |
| 2031 | const char *delim1 = named ? "(" : "\""; | 2039 | const char *delim1 = named ? "(" : "\""; |
| 2032 | const char *delim2 = named ? ")" : "\""; | 2040 | const char *delim2 = named ? ")" : "\""; |
diff --git a/src/treesit.c b/src/treesit.c index 9324b8b1006..08740591f4f 100644 --- a/src/treesit.c +++ b/src/treesit.c | |||
| @@ -1431,11 +1431,16 @@ static void | |||
| 1431 | treesit_check_node (Lisp_Object obj) | 1431 | treesit_check_node (Lisp_Object obj) |
| 1432 | { | 1432 | { |
| 1433 | CHECK_TS_NODE (obj); | 1433 | CHECK_TS_NODE (obj); |
| 1434 | Lisp_Object lisp_parser = XTS_NODE (obj)->parser; | 1434 | if (!treesit_node_uptodate_p (obj)) |
| 1435 | if (XTS_NODE (obj)->timestamp != XTS_PARSER (lisp_parser)->timestamp) | ||
| 1436 | xsignal1 (Qtreesit_node_outdated, obj); | 1435 | xsignal1 (Qtreesit_node_outdated, obj); |
| 1437 | } | 1436 | } |
| 1438 | 1437 | ||
| 1438 | bool treesit_node_uptodate_p (Lisp_Object obj) | ||
| 1439 | { | ||
| 1440 | Lisp_Object lisp_parser = XTS_NODE (obj)->parser; | ||
| 1441 | return XTS_NODE (obj)->timestamp == XTS_PARSER (lisp_parser)->timestamp; | ||
| 1442 | } | ||
| 1443 | |||
| 1439 | DEFUN ("treesit-node-type", | 1444 | DEFUN ("treesit-node-type", |
| 1440 | Ftreesit_node_type, Streesit_node_type, 1, 1, 0, | 1445 | Ftreesit_node_type, Streesit_node_type, 1, 1, 0, |
| 1441 | doc: /* Return the NODE's type as a string. | 1446 | doc: /* Return the NODE's type as a string. |
diff --git a/src/treesit.h b/src/treesit.h index 60f1a0ceaf1..bb8ca20e196 100644 --- a/src/treesit.h +++ b/src/treesit.h | |||
| @@ -180,6 +180,8 @@ make_treesit_parser (Lisp_Object buffer, TSParser *parser, | |||
| 180 | Lisp_Object | 180 | Lisp_Object |
| 181 | make_treesit_node (Lisp_Object parser, TSNode node); | 181 | make_treesit_node (Lisp_Object parser, TSNode node); |
| 182 | 182 | ||
| 183 | bool treesit_node_uptodate_p (Lisp_Object obj); | ||
| 184 | |||
| 183 | extern void treesit_delete_parser (struct Lisp_TS_Parser *); | 185 | extern void treesit_delete_parser (struct Lisp_TS_Parser *); |
| 184 | extern void treesit_delete_query (struct Lisp_TS_Query *); | 186 | extern void treesit_delete_query (struct Lisp_TS_Query *); |
| 185 | extern bool treesit_named_node_p (TSNode); | 187 | extern bool treesit_named_node_p (TSNode); |