]> git.eshelyaron.com Git - emacs.git/commitdiff
Switch buffer in Ftreesit_query_capture
authorYuan Fu <casouri@gmail.com>
Fri, 24 Mar 2023 19:25:19 +0000 (12:25 -0700)
committerYuan Fu <casouri@gmail.com>
Fri, 24 Mar 2023 19:29:34 +0000 (12:29 -0700)
This way both #pred and #match predicates runs in the node's buffer by
default.

* src/treesit.c:
(treesit_predicate_match): No need to switch buffer anymore.
(Ftreesit_query_capture): Switch buffer.

* doc/lispref/parsing.texi (Pattern Matching): Update manual.

doc/lispref/parsing.texi
src/treesit.c

index cba323d3a56fa10f90364b017948b8f44ef285b2..86a5d9f2e52ab4c6e7b5b80ee64fd52c9d91ee2f 100644 (file)
@@ -1311,7 +1311,8 @@ matches regular expression @var{regexp}.  Matching is case-sensitive.
 
 @deffn Predicate pred fn &rest nodes
 Matches if function @var{fn} returns non-@code{nil} when passed each
-node in @var{nodes} as arguments.
+node in @var{nodes} as arguments.  The function runs with the current
+buffer set to the buffer of node being queried.
 @end deffn
 
 Note that a predicate can only refer to capture names that appear in
index 7f4e6cb0e13a44dd187af3678a23408cc5c9c9bb..36a297ec7da194bb98f48fa2f6cec9132a00a313 100644 (file)
@@ -2533,10 +2533,6 @@ treesit_predicate_match (Lisp_Object args, struct capture_range captures,
                                               signal_data))
     return false;
 
-  struct buffer *old_buffer = current_buffer;
-  struct buffer *buffer = XBUFFER (XTS_PARSER (XTS_NODE (node)->parser)->buffer);
-  set_buffer_internal (buffer);
-
   TSNode treesit_node = XTS_NODE (node)->node;
   ptrdiff_t visible_beg = XTS_PARSER (XTS_NODE (node)->parser)->visible_beg;
   uint32_t start_byte_offset = ts_node_start_byte (treesit_node);
@@ -2563,8 +2559,6 @@ treesit_predicate_match (Lisp_Object args, struct capture_range captures,
   ZV = old_zv;
   ZV_BYTE = old_zv_byte;
 
-  set_buffer_internal (old_buffer);
-
   return (val > 0);
 }
 
@@ -2870,6 +2864,10 @@ the query.  */)
   Lisp_Object prev_result = result;
   Lisp_Object predicates_table = make_vector (patterns_count, Qt);
   Lisp_Object predicate_signal_data = Qnil;
+
+  struct buffer *old_buf = current_buffer;
+  set_buffer_internal (buf);
+
   while (ts_query_cursor_next_match (cursor, &match))
     {
       /* Record the checkpoint that we may roll back to.  */
@@ -2925,6 +2923,7 @@ the query.  */)
       ts_query_delete (treesit_query);
       ts_query_cursor_delete (cursor);
     }
+  set_buffer_internal (old_buf);
 
   /* Some capture predicate signaled an error.  */
   if (!NILP (predicate_signal_data))