rapx/analysis/core/api_dep/
mod.rs1#[allow(unused)]
6mod extract;
7#[allow(unused)]
8mod graph;
9#[allow(unused)]
10mod lifetime;
11#[allow(unused)]
12mod visitor;
13
14use crate::{rap_debug, rap_info};
15use graph::ApiDepGraph;
16use rustc_hir::def_id::LOCAL_CRATE;
17use rustc_middle::ty::TyCtxt;
18
19use visitor::FnVisitor;
20
21pub struct ApiDep<'tcx> {
22 pub tcx: TyCtxt<'tcx>,
23}
24
25impl<'tcx> ApiDep<'tcx> {
26 pub fn new(tcx: TyCtxt<'tcx>) -> ApiDep<'tcx> {
27 ApiDep { tcx }
28 }
29 pub fn start(&self) -> ApiDepGraph<'tcx> {
30 let local_crate_name = self.tcx.crate_name(LOCAL_CRATE);
31 let local_crate_type = self.tcx.crate_types()[0];
32 rap_debug!(
33 "Build API dependency graph on {} ({})",
34 local_crate_name.as_str(),
35 local_crate_type
36 );
37
38 let mut api_graph = ApiDepGraph::new();
39 let mut fn_visitor = FnVisitor::new(self.tcx, &mut api_graph);
40 self.tcx.hir_visit_all_item_likes_in_crate(&mut fn_visitor);
41 rap_debug!("api-dep find {} APIs.", fn_visitor.fn_cnt());
42
43 let statistics = api_graph.statistics();
44 rap_debug!(
46 "API Graph contains {} API nodes, {} type nodes, {} generic parameter def nodes",
47 statistics.api_count,
48 statistics.type_count,
49 statistics.generic_param_count
50 );
51
52 let dot_filename = format!("api_graph_{}_{}.dot", local_crate_name, local_crate_type);
53 rap_info!("Dump API dependency graph to {}", dot_filename);
54 api_graph.dump_to_dot(dot_filename, self.tcx);
55 api_graph
56 }
57}