[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);