qlty_analysis/code/
node_counter.rs

1use crate::code::{File, Visitor};
2use crate::lang::Language;
3use tree_sitter::{Node, TreeCursor};
4
5pub struct NodeCounter<'a> {
6    pub count: usize,
7    kinds: &'a [&'a str],
8    source_file: &'a File,
9}
10
11impl Visitor for NodeCounter<'_> {
12    fn language(&self) -> &Box<dyn Language + Sync> {
13        self.source_file.language()
14    }
15
16    fn process_node(&mut self, cursor: &mut TreeCursor) {
17        if self.kinds.contains(&cursor.node().kind()) {
18            self.count += 1;
19        } else {
20            self.process_children(cursor);
21        }
22    }
23}
24
25impl<'a> NodeCounter<'a> {
26    pub fn count(source_file: &'a File, kinds: &'a [&'a str], node: &Node<'a>) -> usize {
27        let mut counter = Self {
28            count: 0,
29            kinds,
30            source_file,
31        };
32        counter.process_node(&mut node.walk());
33        counter.count
34    }
35}