qlty_analysis/code/
node_counter.rs1use 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}