From df3969e9d9f02576c743fc25cad8c607ecb6f503 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 10 Jul 2018 14:00:31 -0700 Subject: [PATCH] Invalidate tree's parent cache after an edit --- src/runtime/tree.c | 2 ++ test/runtime/node_test.cc | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/runtime/tree.c b/src/runtime/tree.c index 1345f065..16b5a18b 100644 --- a/src/runtime/tree.c +++ b/src/runtime/tree.c @@ -41,6 +41,8 @@ const TSLanguage *ts_tree_language(const TSTree *self) { void ts_tree_edit(TSTree *self, const TSInputEdit *edit) { SubtreePool pool = ts_subtree_pool_new(0); self->root = ts_subtree_edit(self->root, edit, &pool); + self->parent_cache_start = 0; + self->parent_cache_size = 0; ts_subtree_pool_delete(&pool); } diff --git a/test/runtime/node_test.cc b/test/runtime/node_test.cc index 54f21c5f..1b953351 100644 --- a/test/runtime/node_test.cc +++ b/test/runtime/node_test.cc @@ -1,3 +1,4 @@ + #include "test_helper.h" #include "runtime/alloc.h" #include "helpers/tree_helpers.h" @@ -543,6 +544,18 @@ describe("Node", [&]() { AssertThat(ts_node_parent(node1), Equals(node2)); }); }); + + describe("parent()", [&]() { + it("works after the tree has been edited (regression)", [&]() { + TSNode false_node = ts_node_named_child(root_node, 1); + + TSInputEdit edit = {0, 0, 5, {0, 0}, {0, 0}, {5, 0}}; + ts_tree_edit(tree, &edit); + + TSNode array_node = ts_node_parent(false_node); + AssertThat(ts_node_start_point(array_node), Equals({7, 0})); + }); + }); }); describe("TreeCursor", [&]() {