diff --git a/Cargo.lock b/Cargo.lock index f5c4e7e4..ca773788 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -584,6 +584,7 @@ dependencies = [ "tree-sitter-highlight", "tree-sitter-loader", "tree-sitter-tags", + "unindent", "walkdir", "webbrowser", "which", @@ -647,6 +648,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "unindent" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa30f5ea51ff7edfc797c6d3f9ec8cbd8cfedef5371766b7181d33977f4814f" + [[package]] name = "utf8-width" version = "0.1.6" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 5403075d..77cf52e4 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -3,7 +3,7 @@ name = "tree-sitter-cli" description = "CLI tool for developing, testing, and using Tree-sitter parsers" version = "0.20.7" authors = ["Max Brunsfeld "] -edition = "2018" +edition = "2021" license = "MIT" readme = "README.md" keywords = ["incremental", "parsing"] @@ -73,6 +73,7 @@ rand = "0.8" tempfile = "3" pretty_assertions = "0.7.2" ctor = "0.1" +unindent = "0.2" [build-dependencies] toml = "0.5" diff --git a/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs index 31cb8035..63dea5a6 100644 --- a/cli/src/tests/query_test.rs +++ b/cli/src/tests/query_test.rs @@ -2,6 +2,7 @@ use super::helpers::{ allocations, fixtures::get_language, query_helpers::{Match, Pattern}, + ITERATION_COUNT, }; use lazy_static::lazy_static; use rand::{prelude::StdRng, SeedableRng}; @@ -10,6 +11,7 @@ use tree_sitter::{ CaptureQuantifier, Language, Node, Parser, Point, Query, QueryCapture, QueryCursor, QueryError, QueryErrorKind, QueryMatch, QueryPredicate, QueryPredicateArg, QueryProperty, }; +use unindent::Unindent; lazy_static! { static ref EXAMPLE_FILTER: Option = env::var("TREE_SITTER_TEST_EXAMPLE_FILTER").ok(); @@ -1920,20 +1922,28 @@ fn test_query_matches_within_point_range() { 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 source = " + [ + a, b, + c, d, + e, f, + g, h, + i, j, + k, l, + ] + " + .unindent(); 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)) + .set_point_range(Point::new(1, 0)..Point::new(2, 3)) .matches(&query, tree.root_node(), source.as_bytes()); - assert_eq!( - collect_matches(matches, &query, source), + collect_matches(matches, &query, &source), &[ (0, vec![("element", "a")]), (0, vec![("element", "b")]), @@ -1942,11 +1952,10 @@ fn test_query_matches_within_point_range() { ); let matches = cursor - .set_point_range(Point::new(1, 0)..Point::new(2, 3)) + .set_point_range(Point::new(2, 0)..Point::new(3, 3)) .matches(&query, tree.root_node(), source.as_bytes()); - assert_eq!( - collect_matches(matches, &query, source), + collect_matches(matches, &query, &source), &[ (0, vec![("element", "c")]), (0, vec![("element", "d")]), @@ -1954,16 +1963,19 @@ fn test_query_matches_within_point_range() { ] ); + // Zero end point is treated like no end point. let matches = cursor - .set_point_range(Point::new(2, 1)..Point::new(0, 0)) + .set_point_range(Point::new(4, 1)..Point::new(0, 0)) .matches(&query, tree.root_node(), source.as_bytes()); - assert_eq!( - collect_matches(matches, &query, source), + collect_matches(matches, &query, &source), &[ - (0, vec![("element", "e")]), - (0, vec![("element", "f")]), (0, vec![("element", "g")]), + (0, vec![("element", "h")]), + (0, vec![("element", "i")]), + (0, vec![("element", "j")]), + (0, vec![("element", "k")]), + (0, vec![("element", "l")]), ] ); }); @@ -3634,17 +3646,22 @@ fn test_query_random() { .parse(include_str!("helpers/query_helpers.rs"), None) .unwrap(); - // let start_seed = *SEED; let start_seed = 0; + let end_seed = start_seed + *ITERATION_COUNT; - for i in 0..100 { - let seed = (start_seed + i) as u64; + for seed in start_seed..(start_seed + end_seed) { + let seed = seed as u64; let mut rand = StdRng::seed_from_u64(seed); let (pattern_ast, _) = Pattern::random_pattern_in_tree(&pattern_tree, &mut rand); let pattern = pattern_ast.to_string(); let expected_matches = pattern_ast.matches_in_tree(&test_tree); - let query = Query::new(language, &pattern).unwrap(); + let query = match Query::new(language, &pattern) { + Ok(query) => query, + Err(e) => { + panic!("failed to build query for pattern {pattern} - {e}. seed: {seed}"); + } + }; let mut actual_matches = cursor .matches( &query, diff --git a/lib/Cargo.toml b/lib/Cargo.toml index d096efdc..c2d35685 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -3,7 +3,7 @@ name = "tree-sitter" description = "Rust bindings to the Tree-sitter parsing library" version = "0.20.9" authors = ["Max Brunsfeld "] -edition = "2018" +edition = "2021" license = "MIT" readme = "binding_rust/README.md" keywords = ["incremental", "parsing"]