From 47d0b4e6f68cec2d876b99ba8fa037a6df7f5cff Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Fri, 4 Jul 2025 13:13:36 -0700 Subject: [PATCH] Handle ts_node_type return NULL (bug#78938) * src/treesit.c (treesit_traverse_match_predicate): Handle the case when ts_node_type returns NULL. (Ftreesit_node_type): Add some comment. (cherry picked from commit 060f964906b64fa8a63a120af9e2380d11d30604) --- src/treesit.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/treesit.c b/src/treesit.c index 8b066b09ef7..d24821f385b 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -2854,7 +2854,9 @@ If NODE is nil, return nil. */) treesit_initialize (); TSNode treesit_node = XTS_NODE (node)->node; - /* ts_node_type could return NULL, see source code. */ + /* ts_node_type could return NULL, see source code (tree-sitter can't + find the string name of a node type by its id in its node name + obarray). */ const char *type = ts_node_type (treesit_node); return type == NULL ? Vtreesit_str_empty : build_string (type); } @@ -4446,6 +4448,10 @@ treesit_traverse_match_predicate (TSTreeCursor *cursor, Lisp_Object pred, if (STRINGP (pred)) { const char *type = ts_node_type (node); + /* ts_node_type returning NULL means something unexpected happend + in tree-sitter, in this case the only reasonable thing is to + not match anything. */ + if (type == NULL) return false; return fast_c_string_match (pred, type, strlen (type)) >= 0; } else if (FUNCTIONP (pred) @@ -4498,6 +4504,10 @@ treesit_traverse_match_predicate (TSTreeCursor *cursor, Lisp_Object pred, { /* A bit of code duplication here, but should be fine. */ const char *type = ts_node_type (node); + /* ts_node_type returning NULL means something unexpected + happend in tree-sitter, in this case the only reasonable + thing is to not match anything */ + if (type == NULL) return false; if (!(fast_c_string_match (car, type, strlen (type)) >= 0)) return false; -- 2.39.5