rapx/analysis/scan/
statistic.rs1use 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}