aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYuan Fu2022-11-02 17:47:14 -0700
committerYuan Fu2022-11-02 17:47:14 -0700
commit88d54756d46101b97b7fde97b4bc3b62f7bd6c06 (patch)
treee95a7a2af31576126a35c19662c1d79112c763b4 /src
parent32e87f09c8c2711c421363d0361693dcfbe5a688 (diff)
downloademacs-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.c10
-rw-r--r--src/treesit.c9
-rw-r--r--src/treesit.h2
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
1431treesit_check_node (Lisp_Object obj) 1431treesit_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
1438bool 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
1439DEFUN ("treesit-node-type", 1444DEFUN ("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,
180Lisp_Object 180Lisp_Object
181make_treesit_node (Lisp_Object parser, TSNode node); 181make_treesit_node (Lisp_Object parser, TSNode node);
182 182
183bool treesit_node_uptodate_p (Lisp_Object obj);
184
183extern void treesit_delete_parser (struct Lisp_TS_Parser *); 185extern void treesit_delete_parser (struct Lisp_TS_Parser *);
184extern void treesit_delete_query (struct Lisp_TS_Query *); 186extern void treesit_delete_query (struct Lisp_TS_Query *);
185extern bool treesit_named_node_p (TSNode); 187extern bool treesit_named_node_p (TSNode);