Removing more fat from the parser lib
This commit is contained in:
parent
a6246a52a0
commit
c1209452cd
11 changed files with 360 additions and 566 deletions
|
|
@ -186,284 +186,270 @@ static inline TSNode ts_node__child(TSNode self, t_u32 child_index, bool include
|
|||
return ts_node__null();
|
||||
}
|
||||
|
||||
static bool ts_subtree_has_trailing_empty_descendant(Subtree self, Subtree other)
|
||||
{
|
||||
for (t_u32 i = ts_subtree_child_count(self) - 1; i + 1 > 0; i--)
|
||||
{
|
||||
Subtree child = ts_subtree_children(self)[i];
|
||||
if (ts_subtree_total_bytes(child) > 0)
|
||||
break;
|
||||
if (child.ptr == other.ptr || ts_subtree_has_trailing_empty_descendant(child, other))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline TSNode ts_node__prev_sibling(TSNode self, bool include_anonymous)
|
||||
{
|
||||
Subtree self_subtree = ts_node__subtree(self);
|
||||
bool self_is_empty = ts_subtree_total_bytes(self_subtree) == 0;
|
||||
t_u32 target_end_byte = ts_node_end_byte(self);
|
||||
|
||||
TSNode node = ts_node_parent(self);
|
||||
TSNode earlier_node = ts_node__null();
|
||||
bool earlier_node_is_relevant = false;
|
||||
|
||||
while (!ts_node_is_null(node))
|
||||
{
|
||||
TSNode earlier_child = ts_node__null();
|
||||
bool earlier_child_is_relevant = false;
|
||||
bool found_child_containing_target = false;
|
||||
|
||||
TSNode child;
|
||||
NodeChildIterator iterator = ts_node_iterate_children(&node);
|
||||
while (ts_node_child_iterator_next(&iterator, &child))
|
||||
{
|
||||
if (child.id == self.id)
|
||||
break;
|
||||
if (iterator.position.bytes > target_end_byte)
|
||||
{
|
||||
found_child_containing_target = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (iterator.position.bytes == target_end_byte &&
|
||||
(!self_is_empty || ts_subtree_has_trailing_empty_descendant(ts_node__subtree(child), self_subtree)))
|
||||
{
|
||||
found_child_containing_target = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ts_node__is_relevant(child, include_anonymous))
|
||||
{
|
||||
earlier_child = child;
|
||||
earlier_child_is_relevant = true;
|
||||
}
|
||||
else if (ts_node__relevant_child_count(child, include_anonymous) > 0)
|
||||
{
|
||||
earlier_child = child;
|
||||
earlier_child_is_relevant = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_child_containing_target)
|
||||
{
|
||||
if (!ts_node_is_null(earlier_child))
|
||||
{
|
||||
earlier_node = earlier_child;
|
||||
earlier_node_is_relevant = earlier_child_is_relevant;
|
||||
}
|
||||
node = child;
|
||||
}
|
||||
else if (earlier_child_is_relevant)
|
||||
{
|
||||
return earlier_child;
|
||||
}
|
||||
else if (!ts_node_is_null(earlier_child))
|
||||
{
|
||||
node = earlier_child;
|
||||
}
|
||||
else if (earlier_node_is_relevant)
|
||||
{
|
||||
return earlier_node;
|
||||
}
|
||||
else
|
||||
{
|
||||
node = earlier_node;
|
||||
earlier_node = ts_node__null();
|
||||
earlier_node_is_relevant = false;
|
||||
}
|
||||
}
|
||||
|
||||
return ts_node__null();
|
||||
}
|
||||
|
||||
static inline TSNode ts_node__next_sibling(TSNode self, bool include_anonymous)
|
||||
{
|
||||
t_u32 target_end_byte = ts_node_end_byte(self);
|
||||
|
||||
TSNode node = ts_node_parent(self);
|
||||
TSNode later_node = ts_node__null();
|
||||
bool later_node_is_relevant = false;
|
||||
|
||||
while (!ts_node_is_null(node))
|
||||
{
|
||||
TSNode later_child = ts_node__null();
|
||||
bool later_child_is_relevant = false;
|
||||
TSNode child_containing_target = ts_node__null();
|
||||
|
||||
TSNode child;
|
||||
NodeChildIterator iterator = ts_node_iterate_children(&node);
|
||||
while (ts_node_child_iterator_next(&iterator, &child))
|
||||
{
|
||||
if (iterator.position.bytes < target_end_byte)
|
||||
continue;
|
||||
if (ts_node_start_byte(child) <= ts_node_start_byte(self))
|
||||
{
|
||||
if (ts_node__subtree(child).ptr != ts_node__subtree(self).ptr)
|
||||
{
|
||||
child_containing_target = child;
|
||||
}
|
||||
}
|
||||
else if (ts_node__is_relevant(child, include_anonymous))
|
||||
{
|
||||
later_child = child;
|
||||
later_child_is_relevant = true;
|
||||
break;
|
||||
}
|
||||
else if (ts_node__relevant_child_count(child, include_anonymous) > 0)
|
||||
{
|
||||
later_child = child;
|
||||
later_child_is_relevant = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ts_node_is_null(child_containing_target))
|
||||
{
|
||||
if (!ts_node_is_null(later_child))
|
||||
{
|
||||
later_node = later_child;
|
||||
later_node_is_relevant = later_child_is_relevant;
|
||||
}
|
||||
node = child_containing_target;
|
||||
}
|
||||
else if (later_child_is_relevant)
|
||||
{
|
||||
return later_child;
|
||||
}
|
||||
else if (!ts_node_is_null(later_child))
|
||||
{
|
||||
node = later_child;
|
||||
}
|
||||
else if (later_node_is_relevant)
|
||||
{
|
||||
return later_node;
|
||||
}
|
||||
else
|
||||
{
|
||||
node = later_node;
|
||||
}
|
||||
}
|
||||
|
||||
return ts_node__null();
|
||||
}
|
||||
|
||||
static inline TSNode ts_node__first_child_for_byte(TSNode self, t_u32 goal, bool include_anonymous)
|
||||
{
|
||||
TSNode node = self;
|
||||
bool did_descend = true;
|
||||
|
||||
while (did_descend)
|
||||
{
|
||||
did_descend = false;
|
||||
|
||||
TSNode child;
|
||||
NodeChildIterator iterator = ts_node_iterate_children(&node);
|
||||
while (ts_node_child_iterator_next(&iterator, &child))
|
||||
{
|
||||
if (ts_node_end_byte(child) > goal)
|
||||
{
|
||||
if (ts_node__is_relevant(child, include_anonymous))
|
||||
{
|
||||
return child;
|
||||
}
|
||||
else if (ts_node_child_count(child) > 0)
|
||||
{
|
||||
did_descend = true;
|
||||
node = child;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ts_node__null();
|
||||
}
|
||||
|
||||
static inline TSNode ts_node__descendant_for_byte_range(TSNode self, t_u32 range_start, t_u32 range_end, bool include_anonymous)
|
||||
{
|
||||
TSNode node = self;
|
||||
TSNode last_visible_node = self;
|
||||
|
||||
bool did_descend = true;
|
||||
while (did_descend)
|
||||
{
|
||||
did_descend = false;
|
||||
|
||||
TSNode child;
|
||||
NodeChildIterator iterator = ts_node_iterate_children(&node);
|
||||
while (ts_node_child_iterator_next(&iterator, &child))
|
||||
{
|
||||
t_u32 node_end = iterator.position.bytes;
|
||||
|
||||
// The end of this node must extend far enough forward to touch
|
||||
// the end of the range and exceed the start of the range.
|
||||
if (node_end < range_end)
|
||||
continue;
|
||||
if (node_end <= range_start)
|
||||
continue;
|
||||
|
||||
// The start of this node must extend far enough backward to
|
||||
// touch the start of the range.
|
||||
if (range_start < ts_node_start_byte(child))
|
||||
break;
|
||||
|
||||
node = child;
|
||||
if (ts_node__is_relevant(node, include_anonymous))
|
||||
{
|
||||
last_visible_node = node;
|
||||
}
|
||||
did_descend = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return last_visible_node;
|
||||
}
|
||||
|
||||
static inline TSNode ts_node__descendant_for_point_range(TSNode self, TSPoint range_start, TSPoint range_end, bool include_anonymous)
|
||||
{
|
||||
TSNode node = self;
|
||||
TSNode last_visible_node = self;
|
||||
|
||||
bool did_descend = true;
|
||||
while (did_descend)
|
||||
{
|
||||
did_descend = false;
|
||||
|
||||
TSNode child;
|
||||
NodeChildIterator iterator = ts_node_iterate_children(&node);
|
||||
while (ts_node_child_iterator_next(&iterator, &child))
|
||||
{
|
||||
TSPoint node_end = iterator.position.extent;
|
||||
|
||||
// The end of this node must extend far enough forward to touch
|
||||
// the end of the range and exceed the start of the range.
|
||||
if (point_lt(node_end, range_end))
|
||||
continue;
|
||||
if (point_lte(node_end, range_start))
|
||||
continue;
|
||||
|
||||
// The start of this node must extend far enough backward to
|
||||
// touch the start of the range.
|
||||
if (point_lt(range_start, ts_node_start_point(child)))
|
||||
break;
|
||||
|
||||
node = child;
|
||||
if (ts_node__is_relevant(node, include_anonymous))
|
||||
{
|
||||
last_visible_node = node;
|
||||
}
|
||||
did_descend = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return last_visible_node;
|
||||
}
|
||||
/* static inline TSNode ts_node__prev_sibling(TSNode self, bool include_anonymous) */
|
||||
/* { */
|
||||
/* Subtree self_subtree = ts_node__subtree(self); */
|
||||
/* bool self_is_empty = ts_subtree_total_bytes(self_subtree) == 0; */
|
||||
/* t_u32 target_end_byte = ts_node_end_byte(self); */
|
||||
/**/
|
||||
/* TSNode node = ts_node_parent(self); */
|
||||
/* TSNode earlier_node = ts_node__null(); */
|
||||
/* bool earlier_node_is_relevant = false; */
|
||||
/**/
|
||||
/* while (!ts_node_is_null(node)) */
|
||||
/* { */
|
||||
/* TSNode earlier_child = ts_node__null(); */
|
||||
/* bool earlier_child_is_relevant = false; */
|
||||
/* bool found_child_containing_target = false; */
|
||||
/**/
|
||||
/* TSNode child; */
|
||||
/* NodeChildIterator iterator = ts_node_iterate_children(&node); */
|
||||
/* while (ts_node_child_iterator_next(&iterator, &child)) */
|
||||
/* { */
|
||||
/* if (child.id == self.id) */
|
||||
/* break; */
|
||||
/* if (iterator.position.bytes > target_end_byte) */
|
||||
/* { */
|
||||
/* found_child_containing_target = true; */
|
||||
/* break; */
|
||||
/* } */
|
||||
/**/
|
||||
/* if (iterator.position.bytes == target_end_byte && */
|
||||
/* (!self_is_empty || ts_subtree_has_trailing_empty_descendant(ts_node__subtree(child), self_subtree))) */
|
||||
/* { */
|
||||
/* found_child_containing_target = true; */
|
||||
/* break; */
|
||||
/* } */
|
||||
/**/
|
||||
/* if (ts_node__is_relevant(child, include_anonymous)) */
|
||||
/* { */
|
||||
/* earlier_child = child; */
|
||||
/* earlier_child_is_relevant = true; */
|
||||
/* } */
|
||||
/* else if (ts_node__relevant_child_count(child, include_anonymous) > 0) */
|
||||
/* { */
|
||||
/* earlier_child = child; */
|
||||
/* earlier_child_is_relevant = false; */
|
||||
/* } */
|
||||
/* } */
|
||||
/**/
|
||||
/* if (found_child_containing_target) */
|
||||
/* { */
|
||||
/* if (!ts_node_is_null(earlier_child)) */
|
||||
/* { */
|
||||
/* earlier_node = earlier_child; */
|
||||
/* earlier_node_is_relevant = earlier_child_is_relevant; */
|
||||
/* } */
|
||||
/* node = child; */
|
||||
/* } */
|
||||
/* else if (earlier_child_is_relevant) */
|
||||
/* { */
|
||||
/* return earlier_child; */
|
||||
/* } */
|
||||
/* else if (!ts_node_is_null(earlier_child)) */
|
||||
/* { */
|
||||
/* node = earlier_child; */
|
||||
/* } */
|
||||
/* else if (earlier_node_is_relevant) */
|
||||
/* { */
|
||||
/* return earlier_node; */
|
||||
/* } */
|
||||
/* else */
|
||||
/* { */
|
||||
/* node = earlier_node; */
|
||||
/* earlier_node = ts_node__null(); */
|
||||
/* earlier_node_is_relevant = false; */
|
||||
/* } */
|
||||
/* } */
|
||||
/**/
|
||||
/* return ts_node__null(); */
|
||||
/* } */
|
||||
/**/
|
||||
/* static inline TSNode ts_node__next_sibling(TSNode self, bool include_anonymous) */
|
||||
/* { */
|
||||
/* t_u32 target_end_byte = ts_node_end_byte(self); */
|
||||
/**/
|
||||
/* TSNode node = ts_node_parent(self); */
|
||||
/* TSNode later_node = ts_node__null(); */
|
||||
/* bool later_node_is_relevant = false; */
|
||||
/**/
|
||||
/* while (!ts_node_is_null(node)) */
|
||||
/* { */
|
||||
/* TSNode later_child = ts_node__null(); */
|
||||
/* bool later_child_is_relevant = false; */
|
||||
/* TSNode child_containing_target = ts_node__null(); */
|
||||
/**/
|
||||
/* TSNode child; */
|
||||
/* NodeChildIterator iterator = ts_node_iterate_children(&node); */
|
||||
/* while (ts_node_child_iterator_next(&iterator, &child)) */
|
||||
/* { */
|
||||
/* if (iterator.position.bytes < target_end_byte) */
|
||||
/* continue; */
|
||||
/* if (ts_node_start_byte(child) <= ts_node_start_byte(self)) */
|
||||
/* { */
|
||||
/* if (ts_node__subtree(child).ptr != ts_node__subtree(self).ptr) */
|
||||
/* { */
|
||||
/* child_containing_target = child; */
|
||||
/* } */
|
||||
/* } */
|
||||
/* else if (ts_node__is_relevant(child, include_anonymous)) */
|
||||
/* { */
|
||||
/* later_child = child; */
|
||||
/* later_child_is_relevant = true; */
|
||||
/* break; */
|
||||
/* } */
|
||||
/* else if (ts_node__relevant_child_count(child, include_anonymous) > 0) */
|
||||
/* { */
|
||||
/* later_child = child; */
|
||||
/* later_child_is_relevant = false; */
|
||||
/* break; */
|
||||
/* } */
|
||||
/* } */
|
||||
/**/
|
||||
/* if (!ts_node_is_null(child_containing_target)) */
|
||||
/* { */
|
||||
/* if (!ts_node_is_null(later_child)) */
|
||||
/* { */
|
||||
/* later_node = later_child; */
|
||||
/* later_node_is_relevant = later_child_is_relevant; */
|
||||
/* } */
|
||||
/* node = child_containing_target; */
|
||||
/* } */
|
||||
/* else if (later_child_is_relevant) */
|
||||
/* { */
|
||||
/* return later_child; */
|
||||
/* } */
|
||||
/* else if (!ts_node_is_null(later_child)) */
|
||||
/* { */
|
||||
/* node = later_child; */
|
||||
/* } */
|
||||
/* else if (later_node_is_relevant) */
|
||||
/* { */
|
||||
/* return later_node; */
|
||||
/* } */
|
||||
/* else */
|
||||
/* { */
|
||||
/* node = later_node; */
|
||||
/* } */
|
||||
/* } */
|
||||
/**/
|
||||
/* return ts_node__null(); */
|
||||
/* } */
|
||||
/**/
|
||||
/* static inline TSNode ts_node__first_child_for_byte(TSNode self, t_u32 goal, bool include_anonymous) */
|
||||
/* { */
|
||||
/* TSNode node = self; */
|
||||
/* bool did_descend = true; */
|
||||
/**/
|
||||
/* while (did_descend) */
|
||||
/* { */
|
||||
/* did_descend = false; */
|
||||
/**/
|
||||
/* TSNode child; */
|
||||
/* NodeChildIterator iterator = ts_node_iterate_children(&node); */
|
||||
/* while (ts_node_child_iterator_next(&iterator, &child)) */
|
||||
/* { */
|
||||
/* if (ts_node_end_byte(child) > goal) */
|
||||
/* { */
|
||||
/* if (ts_node__is_relevant(child, include_anonymous)) */
|
||||
/* { */
|
||||
/* return child; */
|
||||
/* } */
|
||||
/* else if (ts_node_child_count(child) > 0) */
|
||||
/* { */
|
||||
/* did_descend = true; */
|
||||
/* node = child; */
|
||||
/* break; */
|
||||
/* } */
|
||||
/* } */
|
||||
/* } */
|
||||
/* } */
|
||||
/**/
|
||||
/* return ts_node__null(); */
|
||||
/* } */
|
||||
/**/
|
||||
/* static inline TSNode ts_node__descendant_for_byte_range(TSNode self, t_u32 range_start, t_u32 range_end, bool include_anonymous) */
|
||||
/* { */
|
||||
/* TSNode node = self; */
|
||||
/* TSNode last_visible_node = self; */
|
||||
/**/
|
||||
/* bool did_descend = true; */
|
||||
/* while (did_descend) */
|
||||
/* { */
|
||||
/* did_descend = false; */
|
||||
/**/
|
||||
/* TSNode child; */
|
||||
/* NodeChildIterator iterator = ts_node_iterate_children(&node); */
|
||||
/* while (ts_node_child_iterator_next(&iterator, &child)) */
|
||||
/* { */
|
||||
/* t_u32 node_end = iterator.position.bytes; */
|
||||
/**/
|
||||
/* // The end of this node must extend far enough forward to touch */
|
||||
/* // the end of the range and exceed the start of the range. */
|
||||
/* if (node_end < range_end) */
|
||||
/* continue; */
|
||||
/* if (node_end <= range_start) */
|
||||
/* continue; */
|
||||
/**/
|
||||
/* // The start of this node must extend far enough backward to */
|
||||
/* // touch the start of the range. */
|
||||
/* if (range_start < ts_node_start_byte(child)) */
|
||||
/* break; */
|
||||
/**/
|
||||
/* node = child; */
|
||||
/* if (ts_node__is_relevant(node, include_anonymous)) */
|
||||
/* { */
|
||||
/* last_visible_node = node; */
|
||||
/* } */
|
||||
/* did_descend = true; */
|
||||
/* break; */
|
||||
/* } */
|
||||
/* } */
|
||||
/**/
|
||||
/* return last_visible_node; */
|
||||
/* } */
|
||||
/**/
|
||||
/* static inline TSNode ts_node__descendant_for_point_range(TSNode self, TSPoint range_start, TSPoint range_end, bool include_anonymous) */
|
||||
/* { */
|
||||
/* TSNode node = self; */
|
||||
/* TSNode last_visible_node = self; */
|
||||
/**/
|
||||
/* bool did_descend = true; */
|
||||
/* while (did_descend) */
|
||||
/* { */
|
||||
/* did_descend = false; */
|
||||
/**/
|
||||
/* TSNode child; */
|
||||
/* NodeChildIterator iterator = ts_node_iterate_children(&node); */
|
||||
/* while (ts_node_child_iterator_next(&iterator, &child)) */
|
||||
/* { */
|
||||
/* TSPoint node_end = iterator.position.extent; */
|
||||
/**/
|
||||
/* // The end of this node must extend far enough forward to touch */
|
||||
/* // the end of the range and exceed the start of the range. */
|
||||
/* if (point_lt(node_end, range_end)) */
|
||||
/* continue; */
|
||||
/* if (point_lte(node_end, range_start)) */
|
||||
/* continue; */
|
||||
/**/
|
||||
/* // The start of this node must extend far enough backward to */
|
||||
/* // touch the start of the range. */
|
||||
/* if (point_lt(range_start, ts_node_start_point(child))) */
|
||||
/* break; */
|
||||
/**/
|
||||
/* node = child; */
|
||||
/* if (ts_node__is_relevant(node, include_anonymous)) */
|
||||
/* { */
|
||||
/* last_visible_node = node; */
|
||||
/* } */
|
||||
/* did_descend = true; */
|
||||
/* break; */
|
||||
/* } */
|
||||
/* } */
|
||||
/**/
|
||||
/* return last_visible_node; */
|
||||
/* } */
|
||||
|
||||
// TSNode - public
|
||||
|
||||
|
|
@ -812,77 +798,6 @@ t_u32 ts_node_named_child_count(TSNode self)
|
|||
}
|
||||
}
|
||||
|
||||
TSNode ts_node_next_sibling(TSNode self)
|
||||
{
|
||||
return ts_node__next_sibling(self, true);
|
||||
}
|
||||
|
||||
TSNode ts_node_next_named_sibling(TSNode self)
|
||||
{
|
||||
return ts_node__next_sibling(self, false);
|
||||
}
|
||||
|
||||
TSNode ts_node_prev_sibling(TSNode self)
|
||||
{
|
||||
return ts_node__prev_sibling(self, true);
|
||||
}
|
||||
|
||||
TSNode ts_node_prev_named_sibling(TSNode self)
|
||||
{
|
||||
return ts_node__prev_sibling(self, false);
|
||||
}
|
||||
|
||||
TSNode ts_node_first_child_for_byte(TSNode self, t_u32 byte)
|
||||
{
|
||||
return ts_node__first_child_for_byte(self, byte, true);
|
||||
}
|
||||
|
||||
TSNode ts_node_first_named_child_for_byte(TSNode self, t_u32 byte)
|
||||
{
|
||||
return ts_node__first_child_for_byte(self, byte, false);
|
||||
}
|
||||
|
||||
TSNode ts_node_descendant_for_byte_range(TSNode self, t_u32 start, t_u32 end)
|
||||
{
|
||||
return ts_node__descendant_for_byte_range(self, start, end, true);
|
||||
}
|
||||
|
||||
TSNode ts_node_named_descendant_for_byte_range(TSNode self, t_u32 start, t_u32 end)
|
||||
{
|
||||
return ts_node__descendant_for_byte_range(self, start, end, false);
|
||||
}
|
||||
|
||||
TSNode ts_node_descendant_for_point_range(TSNode self, TSPoint start, TSPoint end)
|
||||
{
|
||||
return ts_node__descendant_for_point_range(self, start, end, true);
|
||||
}
|
||||
|
||||
TSNode ts_node_named_descendant_for_point_range(TSNode self, TSPoint start, TSPoint end)
|
||||
{
|
||||
return ts_node__descendant_for_point_range(self, start, end, false);
|
||||
}
|
||||
|
||||
void ts_node_edit(TSNode *self, const TSInputEdit *edit)
|
||||
{
|
||||
t_u32 start_byte = ts_node_start_byte(*self);
|
||||
TSPoint start_point = ts_node_start_point(*self);
|
||||
|
||||
if (start_byte >= edit->old_end_byte)
|
||||
{
|
||||
start_byte = edit->new_end_byte + (start_byte - edit->old_end_byte);
|
||||
start_point = point_add(edit->new_end_point, point_sub(start_point, edit->old_end_point));
|
||||
}
|
||||
else if (start_byte > edit->start_byte)
|
||||
{
|
||||
start_byte = edit->new_end_byte;
|
||||
start_point = edit->new_end_point;
|
||||
}
|
||||
|
||||
self->context[0] = start_byte;
|
||||
self->context[1] = start_point.row;
|
||||
self->context[2] = start_point.column;
|
||||
}
|
||||
|
||||
TSSymbol ts_node_field_id_for_child(TSNode self, t_u32 child_index)
|
||||
{
|
||||
t_const_str name = ts_node_field_name_for_child(self, child_index);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue