From 1769d1459dcfb5f5fb2e04efbc1e457ab7a1b07d Mon Sep 17 00:00:00 2001 From: Andrew Hlynskyi Date: Mon, 8 Mar 2021 20:33:31 +0200 Subject: [PATCH 1/2] fix: don't zeroing provided start position by the end zero position --- lib/src/query.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/src/query.c b/lib/src/query.c index e0793011..8f7f644c 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -2294,7 +2294,6 @@ void ts_query_cursor_set_byte_range( uint32_t end_byte ) { if (end_byte == 0) { - start_byte = 0; end_byte = UINT32_MAX; } self->start_byte = start_byte; @@ -2307,7 +2306,6 @@ void ts_query_cursor_set_point_range( TSPoint end_point ) { if (end_point.row == 0 && end_point.column == 0) { - start_point = POINT_ZERO; end_point = POINT_MAX; } self->start_point = start_point; From 192f51324ef5ae9254967433a760949888e338f1 Mon Sep 17 00:00:00 2001 From: Andrew Hlynskyi Date: Wed, 17 Mar 2021 19:06:01 +0200 Subject: [PATCH 2/2] Added more test for byte and point ranges --- cli/src/tests/query_test.rs | 89 ++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs index a64e1e91..89817dff 100644 --- a/cli/src/tests/query_test.rs +++ b/cli/src/tests/query_test.rs @@ -4,7 +4,7 @@ use std::env; use std::fmt::Write; use tree_sitter::{ allocations, Language, Node, Parser, Query, QueryCapture, QueryCursor, QueryError, - QueryErrorKind, QueryMatch, QueryPredicate, QueryPredicateArg, QueryProperty, + QueryErrorKind, QueryMatch, QueryPredicate, QueryPredicateArg, QueryProperty, Point, }; lazy_static! { @@ -1741,6 +1741,21 @@ fn test_query_matches_within_byte_range() { let tree = parser.parse(&source, None).unwrap(); let mut cursor = QueryCursor::new(); + + let matches = + cursor + .set_byte_range(0, 8) + .matches(&query, tree.root_node(), to_callback(source)); + + assert_eq!( + collect_matches(matches, &query, source), + &[ + (0, vec![("element", "a")]), + (0, vec![("element", "b")]), + (0, vec![("element", "c")]), + ] + ); + let matches = cursor .set_byte_range(5, 15) @@ -1754,6 +1769,78 @@ fn test_query_matches_within_byte_range() { (0, vec![("element", "e")]), ] ); + + let matches = + cursor + .set_byte_range(12, 0) + .matches(&query, tree.root_node(), to_callback(source)); + + assert_eq!( + collect_matches(matches, &query, source), + &[ + (0, vec![("element", "e")]), + (0, vec![("element", "f")]), + (0, vec![("element", "g")]), + ] + ); + }); +} + +#[test] +fn test_query_matches_within_point_range() { + allocations::record(|| { + let language = get_language("javascript"); + let query = Query::new(language, "(identifier) @element").unwrap(); + + let source = "[a, b,\n c, d,\n e, f,\n g]"; + + let mut parser = Parser::new(); + parser.set_language(language).unwrap(); + let tree = parser.parse(&source, None).unwrap(); + + let mut cursor = QueryCursor::new(); + + let matches = + cursor + .set_point_range(Point::new(0, 0), Point::new(1, 3)) + .matches(&query, tree.root_node(), to_callback(source)); + + assert_eq!( + collect_matches(matches, &query, source), + &[ + (0, vec![("element", "a")]), + (0, vec![("element", "b")]), + (0, vec![("element", "c")]), + ] + ); + + let matches = + cursor + .set_point_range(Point::new(1, 0), Point::new(2, 3)) + .matches(&query, tree.root_node(), to_callback(source)); + + assert_eq!( + collect_matches(matches, &query, source), + &[ + (0, vec![("element", "c")]), + (0, vec![("element", "d")]), + (0, vec![("element", "e")]), + ] + ); + + let matches = + cursor + .set_point_range(Point::new(2, 1), Point::new(0, 0)) + .matches(&query, tree.root_node(), to_callback(source)); + + assert_eq!( + collect_matches(matches, &query, source), + &[ + (0, vec![("element", "e")]), + (0, vec![("element", "f")]), + (0, vec![("element", "g")]), + ] + ); }); }