rapx/analysis/core/api_dep/
mod.rs

1/// NOTE: This analysis module is currently under development and is highly unstable.
2/// The #[allow(unused)] attribute is applied to suppress excessive lint warnings.
3/// Once the analysis stabilizes, this marker should be removed.
4
5#[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        // print all statistics
45        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}