diff --git a/src/treesit.c b/src/treesit.c index b210ec0923a..3630db42f5e 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -2466,10 +2466,34 @@ treesit_predicate_match (Lisp_Object args, struct capture_range captures) build_string ("The second argument to `match' should " "be a capture name, not a string")); - Lisp_Object text = treesit_predicate_capture_name_to_text (capture_name, - captures); + Lisp_Object node = treesit_predicate_capture_name_to_node (capture_name, captures); - if (fast_string_match (regexp, text) >= 0) + 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); + uint32_t end_byte_offset = ts_node_end_byte (treesit_node); + ptrdiff_t start_byte = visible_beg + start_byte_offset; + ptrdiff_t end_byte = visible_beg + end_byte_offset; + ptrdiff_t start_pos = buf_bytepos_to_charpos (buffer, start_byte); + ptrdiff_t end_pos = buf_bytepos_to_charpos (buffer, end_byte); + ptrdiff_t old_begv = BEGV; + ptrdiff_t old_zv = ZV; + + SET_BUF_BEGV(buffer, start_pos); + SET_BUF_ZV(buffer, end_pos); + + ptrdiff_t val = fast_looking_at (regexp, start_pos, start_byte, end_pos, end_byte, Qnil); + + SET_BUF_BEGV(buffer, old_begv); + SET_BUF_ZV(buffer, old_zv); + + set_buffer_internal (old_buffer); + + if (val > 0) return true; else return false;