Fix hole in logic for terminating tree balancing
It's important that the repetition nodes have a child count of 2, because we assign to their second child. We could maybe generalize this to allow balancing in the presence of 'extra' nodes like comments and errors, but this might be complicated.
This commit is contained in:
parent
2daae48fe0
commit
16a45d4aa4
1 changed files with 12 additions and 4 deletions
|
|
@ -206,13 +206,21 @@ Tree *ts_tree_make_copy(TreePool *pool, Tree *self) {
|
|||
static void ts_tree__compress(Tree *self, unsigned count, const TSLanguage *language) {
|
||||
Tree *tree = self;
|
||||
for (unsigned i = 0; i < count; i++) {
|
||||
if (tree->ref_count > 1 || tree->child_count != 2) break;
|
||||
|
||||
Tree *child = tree->children[0];
|
||||
if (child->symbol != tree->symbol) break;
|
||||
if (
|
||||
child->ref_count > 1 ||
|
||||
child->child_count != 2 ||
|
||||
child->symbol != tree->symbol
|
||||
) break;
|
||||
|
||||
Tree *grandchild = child->children[0];
|
||||
if (grandchild->symbol != tree->symbol) break;
|
||||
if (grandchild->children[0]->symbol != tree->symbol) break;
|
||||
if (child->ref_count > 1 || grandchild->ref_count > 1) break;
|
||||
if (
|
||||
grandchild->ref_count > 1 ||
|
||||
grandchild->child_count != 2 ||
|
||||
grandchild->symbol != tree->symbol
|
||||
) break;
|
||||
|
||||
tree->children[0] = grandchild;
|
||||
grandchild->context.parent = tree;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue