From 35f82ce301951315e08de3b7e44a18c9170b28b8 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 3 Apr 2020 11:21:47 -0700 Subject: [PATCH] Fix incorrect parent values after call to child_by_field_name Refs tree-sitter/node-tree-sitter#61 Refs tree-sitter/tree-sitter-javascript#127 --- cli/src/tests/node_test.rs | 13 +++++++++++++ lib/src/node.c | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/cli/src/tests/node_test.rs b/cli/src/tests/node_test.rs index 001fdd8f..d4a5a3f9 100644 --- a/cli/src/tests/node_test.rs +++ b/cli/src/tests/node_test.rs @@ -227,6 +227,19 @@ fn test_node_children_by_field_name() { ); } +#[test] +fn test_node_parent_of_child_by_field_name() { + let mut parser = Parser::new(); + parser.set_language(get_language("javascript")).unwrap(); + let tree = parser.parse("foo(a().b[0].c.d.e())", None).unwrap(); + let call_node = tree.root_node().named_child(0).unwrap().named_child(0).unwrap(); + assert_eq!(call_node.kind(), "call_expression"); + + // Regression test - when a field points to a hidden node (in this case, `_expression`) + // the hidden node should not be added to the node parent cache. + assert_eq!(call_node.child_by_field_name("function").unwrap().parent(), Some(call_node)); +} + #[test] fn test_node_named_child() { let tree = parse_json_example(); diff --git a/lib/src/node.c b/lib/src/node.c index b03e2fc9..576f3ef3 100644 --- a/lib/src/node.c +++ b/lib/src/node.c @@ -150,7 +150,9 @@ static inline TSNode ts_node__child( while (ts_node_child_iterator_next(&iterator, &child)) { if (ts_node__is_relevant(child, include_anonymous)) { if (index == child_index) { - ts_tree_set_cached_parent(self.tree, &child, &self); + if (ts_node__is_relevant(self, true)) { + ts_tree_set_cached_parent(self.tree, &child, &self); + } return child; } index++;