From: Yuan Fu Date: Fri, 14 Apr 2023 02:20:53 +0000 (-0700) Subject: Add treesit-node-match-p X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a4de6d8dd3b6a5ac39737812e17a2a8d766e9f3a;p=emacs.git Add treesit-node-match-p * src/treesit.c (Ftreesit_node_match_p): New function. --- diff --git a/src/treesit.c b/src/treesit.c index dbbfa29c19d..b15a53236e4 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -3612,6 +3612,37 @@ a regexp. */) return parent; } +DEFUN ("treesit-node-match-p", + Ftreesit_node_match_p, + Streesit_node_match_p, 2, 2, 0, + doc: /* Check whether NODE matches PREDICATE. + +PREDICATE can be a regexp matching node type, a predicate function, +and more, see `treesit-things-definition' for detail. Return non-nil +if NODE matches PRED, nil otherwise. */) + (Lisp_Object node, Lisp_Object predicate) +{ + CHECK_TS_NODE (node); + + Lisp_Object signal_data = Qnil; + if (!treesit_traverse_validate_predicate (predicate, &signal_data)) + xsignal1 (Qtreesit_invalid_predicate, signal_data); + + Lisp_Object parser = XTS_NODE (node)->parser; + TSTreeCursor cursor = ts_tree_cursor_new (XTS_NODE (node)->node); + + specpdl_ref count = SPECPDL_INDEX (); + record_unwind_protect_ptr (treesit_traverse_cleanup_cursor, &cursor); + + bool match = false; + match = treesit_traverse_match_predicate (&cursor, predicate, + parser, false); + + unbind_to (count, Qnil); + + return match ? Qt : Qnil; +} + DEFUN ("treesit-subtree-stat", Ftreesit_subtree_stat, Streesit_subtree_stat, 1, 1, 0, @@ -3879,6 +3910,7 @@ then in the system default locations for dynamic libraries, in that order. */); defsubr (&Streesit_search_subtree); defsubr (&Streesit_search_forward); defsubr (&Streesit_induce_sparse_tree); + defsubr (&Streesit_node_match_p); defsubr (&Streesit_subtree_stat); #endif /* HAVE_TREE_SITTER */ defsubr (&Streesit_available_p);