diff --git a/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs index 1ca1e658..9e3f5303 100644 --- a/cli/src/tests/query_test.rs +++ b/cli/src/tests/query_test.rs @@ -4577,19 +4577,22 @@ fn test_query_max_start_depth() { #[rustfmt::skip] let rows = &[ Row { - description: "depth 0: match all", + description: "depth 0: match translation unit", + depth: 0, + pattern: r#" + (translation_unit) @capture + "#, + matches: &[ + (0, &[("capture", "if (a1 && a2) {\n if (b1 && b2) { }\n if (c) { }\n}\nif (d) {\n if (e1 && e2) { }\n if (f) { }\n}\n")]), + ] + }, + Row { + description: "depth 0: match none", depth: 0, pattern: r#" (if_statement) @capture "#, - matches: &[ - (0, &[("capture", "if (a1 && a2) {\n if (b1 && b2) { }\n if (c) { }\n}")]), - (0, &[("capture", "if (b1 && b2) { }")]), - (0, &[("capture", "if (c) { }")]), - (0, &[("capture", "if (d) {\n if (e1 && e2) { }\n if (f) { }\n}")]), - (0, &[("capture", "if (e1 && e2) { }")]), - (0, &[("capture", "if (f) { }")]), - ] + matches: &[] }, Row { description: "depth 1: match 2 if statements at the top level", diff --git a/lib/binding_rust/bindings.rs b/lib/binding_rust/bindings.rs index 912916c0..faec9d3b 100644 --- a/lib/binding_rust/bindings.rs +++ b/lib/binding_rust/bindings.rs @@ -639,7 +639,7 @@ extern "C" { ) -> bool; } extern "C" { - #[doc = " Set the maximum start depth for a cursor.\n\n This prevents cursors from exploring children nodes at a certain depth.\n Note if a pattern includes many children, then they will still be checked.\n\n Set to `0` to remove the maximum start depth."] + #[doc = " Set the maximum start depth for a query cursor.\n\n This prevents cursors from exploring children nodes at a certain depth.\n Note if a pattern includes many children, then they will still be checked.\n\n The zero max start depth value can be used as a special behavior and\n it helps to destructure a subtree by staying on a node and using captures\n for interested parts. Note that the zero max start depth only limit a search\n depth for a pattern's root node but other nodes that are parts of the pattern\n may be searched at any depth what defined by the pattern structure.\n\n Set to `UINT32_MAX` to remove the maximum start depth."] pub fn ts_query_cursor_set_max_start_depth(arg1: *mut TSQueryCursor, arg2: u32); } extern "C" { diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h index d9560f24..349f6838 100644 --- a/lib/include/tree_sitter/api.h +++ b/lib/include/tree_sitter/api.h @@ -984,12 +984,18 @@ bool ts_query_cursor_next_capture( ); /** - * Set the maximum start depth for a cursor. + * Set the maximum start depth for a query cursor. * * This prevents cursors from exploring children nodes at a certain depth. * Note if a pattern includes many children, then they will still be checked. * - * Set to `0` to remove the maximum start depth. + * The zero max start depth value can be used as a special behavior and + * it helps to destructure a subtree by staying on a node and using captures + * for interested parts. Note that the zero max start depth only limit a search + * depth for a pattern's root node but other nodes that are parts of the pattern + * may be searched at any depth what defined by the pattern structure. + * + * Set to `UINT32_MAX` to remove the maximum start depth. */ void ts_query_cursor_set_max_start_depth(TSQueryCursor *, uint32_t); diff --git a/lib/src/query.c b/lib/src/query.c index ff4bb06c..be4464ea 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -4124,11 +4124,7 @@ void ts_query_cursor_set_max_start_depth( TSQueryCursor *self, uint32_t max_start_depth ) { - if (max_start_depth == 0) { - self->max_start_depth = UINT32_MAX; - } else { - self->max_start_depth = max_start_depth; - } + self->max_start_depth = max_start_depth; } #undef LOG