From: Yuan Fu Date: Thu, 3 Nov 2022 00:47:14 +0000 (-0700) Subject: Check for outdated tree-sitter node when printing X-Git-Tag: emacs-29.0.90~1730 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=88d54756d46101b97b7fde97b4bc3b62f7bd6c06;p=emacs.git 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. --- 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, case PVEC_TS_NODE: /* Prints # or #. */ - print_c_string ("#", printcharfun); + break; + } + printchar (' ', printcharfun); + /* Now the node must be up-to-date, and calling functions like + Ftreesit_node_start will not signal. */ bool named = treesit_named_node_p (XTS_NODE (obj)->node); const char *delim1 = named ? "(" : "\""; 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 treesit_check_node (Lisp_Object obj) { CHECK_TS_NODE (obj); - Lisp_Object lisp_parser = XTS_NODE (obj)->parser; - if (XTS_NODE (obj)->timestamp != XTS_PARSER (lisp_parser)->timestamp) + if (!treesit_node_uptodate_p (obj)) xsignal1 (Qtreesit_node_outdated, obj); } +bool treesit_node_uptodate_p (Lisp_Object obj) +{ + Lisp_Object lisp_parser = XTS_NODE (obj)->parser; + return XTS_NODE (obj)->timestamp == XTS_PARSER (lisp_parser)->timestamp; +} + DEFUN ("treesit-node-type", Ftreesit_node_type, Streesit_node_type, 1, 1, 0, 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, Lisp_Object make_treesit_node (Lisp_Object parser, TSNode node); +bool treesit_node_uptodate_p (Lisp_Object obj); + extern void treesit_delete_parser (struct Lisp_TS_Parser *); extern void treesit_delete_query (struct Lisp_TS_Query *); extern bool treesit_named_node_p (TSNode);