Start work on exposing APIs for node descendant counts and indices
This commit is contained in:
parent
2a9d951cd6
commit
9dd725b4e3
9 changed files with 502 additions and 72 deletions
|
|
@ -385,10 +385,30 @@ fn test_node_named_child_with_aliases_and_extras() {
|
|||
assert_eq!(root.named_child(4).unwrap().kind(), "C");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_node_descendant_count() {
|
||||
let tree = parse_json_example();
|
||||
let value_node = tree.root_node();
|
||||
let all_nodes = get_all_nodes(&tree);
|
||||
|
||||
assert_eq!(value_node.descendant_count(), all_nodes.len());
|
||||
|
||||
let mut cursor = value_node.walk();
|
||||
for (i, node) in all_nodes.iter().enumerate() {
|
||||
cursor.goto_descendant(i);
|
||||
assert_eq!(cursor.node(), *node, "index {i}");
|
||||
}
|
||||
|
||||
for (i, node) in all_nodes.iter().enumerate().rev() {
|
||||
cursor.goto_descendant(i);
|
||||
assert_eq!(cursor.node(), *node, "rev index {i}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_node_descendant_for_range() {
|
||||
let tree = parse_json_example();
|
||||
let array_node = tree.root_node().child(0).unwrap();
|
||||
let array_node = tree.root_node();
|
||||
|
||||
// Leaf node exactly matches the given bounds - byte query
|
||||
let colon_index = JSON_EXAMPLE.find(":").unwrap();
|
||||
|
|
@ -841,15 +861,17 @@ fn get_all_nodes(tree: &Tree) -> Vec<Node> {
|
|||
let mut visited_children = false;
|
||||
let mut cursor = tree.walk();
|
||||
loop {
|
||||
result.push(cursor.node());
|
||||
if !visited_children && cursor.goto_first_child() {
|
||||
continue;
|
||||
} else if cursor.goto_next_sibling() {
|
||||
visited_children = false;
|
||||
} else if cursor.goto_parent() {
|
||||
visited_children = true;
|
||||
if !visited_children {
|
||||
result.push(cursor.node());
|
||||
if !cursor.goto_first_child() {
|
||||
visited_children = true;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
if cursor.goto_next_sibling() {
|
||||
visited_children = false;
|
||||
} else if !cursor.goto_parent() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue