From 88d54756d46101b97b7fde97b4bc3b62f7bd6c06 Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Wed, 2 Nov 2022 17:47:14 -0700 Subject: [PATCH] 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. --- src/print.c | 10 +++++++++- src/treesit.c | 9 +++++++-- 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, 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); -- 2.39.5