Skip to main content

cairo_language_common/
syntax_ext.rs

1use cairo_lang_syntax::node::SyntaxNode;
2use salsa::Database;
3
4pub trait SyntaxNodeExt {
5    /// Faster than [`SyntaxNode::tokens`] because we don't travel each leaf, and does not allocate.
6    fn for_each_terminal<'db>(&self, db: &'db dyn Database, callback: impl FnMut(&SyntaxNode<'db>))
7    where
8        Self: 'db;
9}
10
11impl<'a> SyntaxNodeExt for SyntaxNode<'a> {
12    fn for_each_terminal<'db>(
13        &self,
14        db: &'db dyn Database,
15        mut callback: impl FnMut(&SyntaxNode<'db>),
16    ) where
17        Self: 'db,
18    {
19        for_each_terminals_ex(self, db, &mut callback)
20    }
21}
22
23fn for_each_terminals_ex<'db>(
24    node: &SyntaxNode<'db>,
25    db: &'db dyn Database,
26    callback: &mut impl FnMut(&SyntaxNode<'db>),
27) {
28    if node.green_node(db).kind.is_terminal() {
29        callback(node);
30        return;
31    }
32
33    for child in node.get_children(db) {
34        for_each_terminals_ex(child, db, callback);
35    }
36}