emacs-diffs
[Top][All Lists]
Advanced

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

master a4de6d8dd3b 1/7: Add treesit-node-match-p


From: Yuan Fu
Subject: master a4de6d8dd3b 1/7: Add treesit-node-match-p
Date: Fri, 14 Apr 2023 20:04:47 -0400 (EDT)

branch: master
commit a4de6d8dd3b6a5ac39737812e17a2a8d766e9f3a
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Add treesit-node-match-p
    
    * src/treesit.c (Ftreesit_node_match_p): New function.
---
 src/treesit.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

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



reply via email to

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