diff --git a/src/treesit.c b/src/treesit.c index b163685419f..510170ca640 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -2466,10 +2466,41 @@ 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, + 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_begv_byte = BEGV_BYTE; + ptrdiff_t old_zv = ZV; + ptrdiff_t old_zv_byte = ZV_BYTE; + + BEGV = start_pos; + BEGV_BYTE = start_byte; + ZV = end_pos; + ZV_BYTE = end_byte; + + ptrdiff_t val = fast_looking_at (regexp, start_pos, start_byte, end_pos, end_byte, Qnil); + + BEGV = old_begv; + BEGV_BYTE = old_begv_byte; + ZV = old_zv; + ZV_BYTE = old_zv_byte; + + set_buffer_internal (old_buffer); + + if (val > 0) return true; else return false;