Skip to content

Commit 2bc8ce2

Browse files
authored
fix(syntax): avoid quadratic allocation in Node::filter_map (#1598)
1 parent f99a75f commit 2bc8ce2

1 file changed

Lines changed: 7 additions & 8 deletions

File tree

crates/syntax/src/ast/node.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -704,24 +704,23 @@ impl<'ast, 'arena> Node<'ast, 'arena> {
704704
where
705705
F: Fn(&Node<'ast, 'arena>) -> Option<T>,
706706
{
707-
self.filter_map_internal(&f)
707+
let mut result = vec![];
708+
self.filter_map_internal(&f, &mut result);
709+
result
708710
}
709711

710712
#[inline]
711-
fn filter_map_internal<F, T: 'ast>(&self, f: &F) -> Vec<T>
713+
fn filter_map_internal<F, T: 'ast>(&self, f: &F, result: &mut Vec<T>)
712714
where
713715
F: Fn(&Node<'ast, 'arena>) -> Option<T>,
714716
{
715-
let mut result = vec![];
716717
for child in self.children() {
717-
result.extend(child.filter_map_internal(f));
718+
child.filter_map_internal(f, result);
718719
}
719720

720-
if let Some(child) = f(self) {
721-
result.push(child);
721+
if let Some(item) = f(self) {
722+
result.push(item);
722723
}
723-
724-
result
725724
}
726725

727726
#[inline]

0 commit comments

Comments
 (0)