rapx/analysis/scan/
statistic.rs

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