emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/tree-sitter 88d54756d4 2/2: Check for outdated tree-sitter node


From: Yuan Fu
Subject: feature/tree-sitter 88d54756d4 2/2: Check for outdated tree-sitter node when printing
Date: Wed, 2 Nov 2022 20:49:15 -0400 (EDT)

branch: feature/tree-sitter
commit 88d54756d46101b97b7fde97b4bc3b62f7bd6c06
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    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 a41ffa6cf0..1749d79299 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 #<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 ? ")" : "\"";
diff --git a/src/treesit.c b/src/treesit.c
index 9324b8b100..08740591f4 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 60f1a0ceaf..bb8ca20e19 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);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]