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