rapx/analysis/scan/
statistic.rs

1use rustc_hir::def_id::DefId;
2use std::collections::HashSet;
3
4#[derive(Default)]
5pub struct Statistics<'tcx> {
6    pub pub_non_generic_api: HashSet<DefId>,
7    pub pub_generic_api: HashSet<DefId>,
8    pub pub_unsafe_api: HashSet<DefId>,
9    pub unsafe_block: Vec<rustc_hir::Block<'tcx>>,
10}
11
12pub struct CrateSafetyInfo {
13    pub num_total_api: usize,
14    pub num_generic_api: usize,
15    pub num_unsafe_api: usize,
16    pub num_unsafe_block: usize,
17}
18
19impl<'tcx> Statistics<'tcx> {
20    pub fn total_api_count(&self) -> usize {
21        self.pub_non_generic_api.len() + self.pub_generic_api.len()
22    }
23
24    pub fn generic_api_count(&self) -> usize {
25        self.pub_generic_api.len()
26    }
27
28    pub fn num_unsafe_api(&self) -> usize {
29        self.pub_unsafe_api.len()
30    }
31
32    pub fn num_unsafe_block(&self) -> usize {
33        self.unsafe_block.len()
34    }
35
36    pub fn info(&self) -> CrateSafetyInfo {
37        CrateSafetyInfo {
38            num_total_api: self.total_api_count(),
39            num_generic_api: self.generic_api_count(),
40            num_unsafe_api: self.num_unsafe_api(),
41            num_unsafe_block: self.num_unsafe_block(),
42        }
43    }
44}
45
46impl CrateSafetyInfo {
47    pub fn print_log(&self) {
48        rap_info!("# total api    = {}", self.num_total_api);
49        rap_info!("# generic api  = {}", self.num_generic_api);
50        rap_info!("# unsafe api   = {}", self.num_unsafe_api);
51        rap_info!("# unsafe block = {}", self.num_unsafe_block);
52    }
53}