]> git.eshelyaron.com Git - emacs.git/commitdiff
Check for outdated tree-sitter node when printing
authorYuan Fu <casouri@gmail.com>
Thu, 3 Nov 2022 00:47:14 +0000 (17:47 -0700)
committerYuan Fu <casouri@gmail.com>
Thu, 3 Nov 2022 00:47:14 +0000 (17:47 -0700)
* 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
src/treesit.c
src/treesit.h

index a41ffa6cf041869bacd8d1a7fa0efddf9c9adcc0..1749d79299bb3c789523c498bbe94640f0a5ee96 100644 (file)
@@ -2026,7 +2026,15 @@ print_vectorlike (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag,
     case PVEC_TS_NODE:
       /* Prints #<treesit-node (identifier) in 12-15> or
          #<treesit-node "keyword" in 28-31>. */
-      print_c_string ("#<treesit-node ", printcharfun);
+      print_c_string ("#<treesit-node", printcharfun);
+      if (!treesit_node_uptodate_p (obj))
+       {
+         print_c_string ("-outdated>", 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 ? ")" : "\"";
index 9324b8b1006bb23caec8c4bbe36321a4392e1288..08740591f4f628edc600c4f7b17d155c0bdd6595 100644 (file)
@@ -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.
index 60f1a0ceaf102b7f0275160131ede6204c2f58a8..bb8ca20e1961d418255026b23640de8475a1a778 100644 (file)
@@ -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);